发布时间:2025-06-24 10:31:17 作者:北方职教升学中心 阅读量:456
那么如何解决呢?
这时候就要用到我们的单活模式队列来保证每个队列存在多个消费者实例,但是只会有一个实例起作用
我们只需要在创建队列时指定队列属性即可
@Configurationpublic class TripleQueueConfig { @Bean public DirectExchange directExchange(){ DirectExchange directExchange = new DirectExchange("triple_exchange"); return directExchange; } @Bean public Queue tripleQueueOne(){ Queue queue = creatQueue("triple_queue_one"); return queue; } @Bean public Queue tripleQueueTwo(){ Queue queue = creatQueue("triple_queue_two"); return queue; } @Bean public Queue tripleQueueThree(){ Queue queue = creatQueue("triple_queue_three"); return queue; } @Bean public Binding bindingOne(){ return BindingBuilder.bind(tripleQueueOne()).to(directExchange()).with("triple-one"); } @Bean public Binding bindingTwo(){ return BindingBuilder.bind(tripleQueueTwo()).to(directExchange()).with("triple-two"); } @Bean public Binding bindingThree(){ return BindingBuilder.bind(tripleQueueThree()).to(directExchange()).with("triple-three"); } private Queue creatQueue(String name) { // 创建一个 单活模式 队列 HashMap<String, Object> args = new HashMap<>(); args.put("x-single-active-consumer", true); return new Queue(name, true, false, false, args); }}
此时可以看到mq将一个消费者标记为了single active,表示只有这一个消费者起作用,另一个标记为了waiting
查看消费结果:
SingleActiveListener1 消费订单操作id:1 用户id:3SingleActiveListener1 消费订单操作id:2 用户id:3SingleActiveListener1 消费订单操作id:3 用户id:3SingleActiveListener1 消费订单操作id:1 用户id:2SingleActiveListener1 消费订单操作id:2 用户id:2SingleActiveListener1 消费订单操作id:3 用户id:2SingleActiveListener1 消费订单操作id:1 用户id:1SingleActiveListener1 消费订单操作id:2 用户id:1SingleActiveListener1 消费订单操作id:3 用户id:1
可以看到此时就和只配置一个消费者的情况一样了
那么问题来了
我为了提高并发处理能力创建了多个消费者,但是呢我为了保证消息消费顺序我又只能让一个消费者起作用
emmmm.......