Rabbitmq 高级特性 - 消费端限流

本文详细介绍了如何在Spring Boot中使用RabbitMQ实现消费端限流,包括设置手动确认模式,配置Listener-container的prefetch属性,以及关键步骤的代码示例。通过实例演示了如何通过调整预取值控制消息消费速率。
摘要由CSDN通过智能技术生成

Rabbitmq 高级特性 - 消费端限流

在这里插入图片描述

  • 消费端步骤(在原有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>
        

        在这里插入图片描述

    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. 运行结果
      在这里插入图片描述

    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. 运行结果(可以看到间隔一秒一条,图片看不出)
      在这里插入图片描述


  • 消费端限流小结
    1. 在rabbit:listener-container 中配置 prefetch属性设置消费端一次拉取多少消息
    2. 消费端的确认模式一定为手动确认。acknowledge=“manual”
    • 一定要手动确认!
    • 一定要手动确认!
    • 一定要手动确认!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值