Rabbitmq 高级特性 - 消费端限流

Rabbitmq 高级特性 - 消费端限流

Rabbitmq 高级特性 - 消费端限流_第1张图片

  • 消费端步骤(在原有RabbitMQ 高级特性 Consumer Ack的基础)

    1. 新建信监听类

      package com.yang.listener;
      
      import com.rabbitmq.client.Channel;
      import org.springframework.amqp.core.Message;
      import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
      import org.springframework.stereotype.Component;
      
      /**
       * consumer限流机制
       */
      @Component
      public class QosListener implements ChannelAwareMessageListener {
          @Override
          public void onMessage(Message message, Channel channel) throws Exception {
      
          }
      }
      
      
    2. 限流的步骤

      1. 确保ack机制为手动签收(配置文件监听容器哪里acknowledge="manual")

         
            <rabbitmq:listener-container connection-factory="connectionFactory" acknowledge="manual">
                <rabbit:listener ref="qosListener" queue-names="test_queue_confirm"/>
            rabbitmq:listener-container>
        
      2. Listener-container配置属性(刚刚定义监听器容器哪里配prefetch="1")

        	<rabbitmq:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="1">
                <rabbit:listener ref="qosListener" queue-names="test_queue_confirm"/>
            rabbitmq:listener-container>
        

        Rabbitmq 高级特性 - 消费端限流_第2张图片

    3. 完整代码

      package com.yang.listener;
      
      import com.rabbitmq.client.Channel;
      import org.springframework.amqp.core.Message;
      import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
      import org.springframework.stereotype.Component;
      
      /**
       * consumer限流机制
       *      1. 确保ack机制为手动签收
       *      2. Listener-container配置属性
       *          perfetch = 1, 表示消费端每次从mq来消费,知道手动确认完毕后,才会继续拉取下一条消息
       */
      @Component
      public class QosListener implements ChannelAwareMessageListener {
          @Override
          public void onMessage(Message message, Channel channel) throws Exception {
              //1. 获取消息
              System.out.println(new String(message.getBody()));
              //2. 处理业务逻辑
              System.out.println("处理业务逻辑");
              //3. 签收
              channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
          }
      }
      
      
    4. 在以前写过的代码生成者里面,发送请求(RabbitMQ 高级特性 - 消息的可靠性投递)

      	@Test
          public void testSend() {
              for (int i = 0; i < 10; i++) {
                  //1. 发送消息
                  rabbitTemplate.convertAndSend("test_exchange_confirm","confirm","message confirm ...");
              }
      
          }
      

      在这里插入图片描述

    5. 为了看到效果把签收消息注释调,这样它只会拉取一条,来消费因为它认为我们还没有完成.

      @Component
      public class QosListener implements ChannelAwareMessageListener {
          @Override
          public void onMessage(Message message, Channel channel) throws Exception {
              //1. 获取消息
              System.out.println(new String(message.getBody()));
              //2. 处理业务逻辑
              System.out.println("处理业务逻辑");
              //3. 签收
      //        channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
          }
      }
      
    6. 运行结果
      Rabbitmq 高级特性 - 消费端限流_第3张图片

    7. 使用接受的签收的(为了看到效果,每次停止1秒)

      @Component
      public class QosListener implements ChannelAwareMessageListener {
          @Override
          public void onMessage(Message message, Channel channel) throws Exception {
              //1. 获取消息
              System.out.println(new String(message.getBody()));
              //2. 处理业务逻辑
              System.out.println("处理业务逻辑");
              //3. 签收
              channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
              
              Thread.sleep(1000);
          }
      }
      
      
    8. 运行结果(可以看到间隔一秒一条,图片看不出)
      Rabbitmq 高级特性 - 消费端限流_第4张图片


  • 消费端限流小结
    1. 在rabbit:listener-container 中配置 prefetch属性设置消费端一次拉取多少消息
    2. 消费端的确认模式一定为手动确认。acknowledge=“manual”
    • 一定要手动确认!
    • 一定要手动确认!
    • 一定要手动确认!

你可能感兴趣的:(消息队列,rabbitmq,高级特性,消费端限流)