正常情况下,生产者与消费者的代码都跑起来,才开始运行业务,你生产消息,我快速消费消息的。
在解决这个问题的时候,https://mp.csdn.net/postedit/80662904, 偶然发现了这个坑,如题。
背景:一个队列对应20个消费者。有很多个队列,channel 数量200左右, 一个消费者对应一个channel。
问题: 消费者的代码没有启动,现在一个队列已经有消息60个了。 现要启动消费者时,启动报错,且造成消息的数量有问题。
图可能不是很直观,说明一下, 一个队列20个消费者,正常来说,在启动消费者代码的时候,每个消费者对应一个新的channel,
每当一个消费者订阅一个消息时,拿到消息,就去干活了。
日志现在报,有消费者在绑定channel的时候,绑定到别人的channel。
思路: 之前的思路遍历所有队列,给每个队列生成20个消费者,每个消费者指定一个channel的时候,便去订阅消息。
conn.createChannel();
消费者创建指定新的channel;
channel.basicConsume(queue, autoAck, "myConsumerTag", new DefaultConsumer(getChannel())
消费者拿到 channel,便订阅消息。
故这样,所有消费者还没指定channel, 就有消费者拿到消息去干活了, 故就启动报错了。
启动报错不暂停的情况下,经发现消息,数量不对,且消息消费混乱。
rabbitmq原码追综,没有搞懂,消费者创建新的channel,为什么是之前消费者绑定的,重复引用。
改造: 所有消费者都指定好channel, 才一起订阅消息。 这样channel肯定不会重复。