我有一个队列,监听器正在监听一个队列,这个队列有一些预取计数,比如10个,它正在将这10个元素传递给某个处理器。处理器可以处理某些任务,也可以不处理或延迟它。在我收到这样的信息后,我想把它( channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
)从队列中出队。
实现这一目标的最佳方法是什么?我想到了一个想法,就是我创建另一个队列,然后将处理过的消息从处理器推送到队列中,其中包含传递标签和通道引用。我将监听这个新队列,并在此基础上进行确认。
发布于 2016-09-25 13:50:12
通道不是线程安全的-请参阅rabbitmq documentation。
通道实例不得在线程之间共享。应用程序应该更喜欢使用每个线程的Channel,而不是在多个线程之间共享相同的Channel。虽然通道上的一些操作可以安全地并发调用,但有些操作却不安全,并且会导致线路上不正确的帧交错。线程之间的共享通道也会干扰* Publisher确认。
您应该只使用侦听器线程本身上的ChannelAwareMessageListener
公开的通道。
如果您试图实现并发,通常最好使用容器的concurrentConsumers
属性,而不是将消息传递给其他线程。
https://stackoverflow.com/questions/39685182
复制相似问题