zoukankan      html  css  js  c++  java
  • RabbitMQ的高级特性(二)消费端限流 lq

    1. 应用场景:
      image
    2. 代码示例:
      • pom依赖和rabbitmq.properties与spring集成rabbitmq相同
      • 在spring-rabbitmq-consumer.xml 需要做如下配置:(设置消费者监听器为手动确认模式,并且配置参数prefetch表示消费端每次从mq拉取多少条消息。直到手动确认消费完毕,才会继续拉取)
        image
      • 限流消费端-没有手动确认代码:
        /**
         * Consumer 限流机制
         *  1. 确保消息被确认,不确认是不会处理其他消息。
         *  2. listener-container配置属性
         *      prefetch = 1,表示消费端每次从mq拉去一条消息来消费,直到确认消费完毕后,才会继续拉取下一条消息。
         *  3. 手动自动都可以实现完全消费,但是只有消息确认消费完毕,才可以拉取下一条。
         *  4. 但是在限流策略中,必须设置为手动确认。因为自动确认其实就跟平常的消费没有区别了。
         */
        public class QosListener implements ChannelAwareMessageListener {
        	@Override
        	public void onMessage(Message message, Channel channel) throws Exception {
        		//1.获取消息
        		System.out.println(new String(message.getBody()));
        	}
        }
        
      • producer生产消息代码:
        @RunWith(SpringRunner.class)
        @ContextConfiguration(locations = "classpath:spring-rabbitmq-producer.xml")
        public class ProducerTest {
        
        	@Test
        	public void testSend() {
        		for (int i = 0; i < 10; i++) {
        			rabbitTemplate.convertAndSend("test_exchange_confirm","confirm","message confirm");
        		}
        	}
        }
        
      • 因为上面消费端没有手动确认,所以会出现 1条消息待确认,9条消息未消费的情况。
        image
      • 消费端限流--手动确认代码:
        image
    3. 消费端限流小结:
      • 在 rabbit:listener-container中配置 prefetch 属性设置消费端一次拉取多少条消息
      • 消费端的确认模式一定为手动确认。acknowledge="manual",并且手动确认一定要调用channel.basicAck();方法。
      • 实现接口一定是实现ChannelAwareMessageListener接口。
  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/rbwbear/p/15557913.html
Copyright © 2011-2022 走看看