ChannelAwareMessageListener的回调机制函数

时间:2016-09-25 09:09:03

标签: callback rabbitmq amqp spring-amqp

我有一个队列,其中侦听器正在侦听队列,其中一些预取计数可以说是10.它将这10个元素传递给某个处理器。 处理器可以处理某个任务,也可以不处理或延迟它。我希望在收到此类信息后将其从队列中出列(channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);)。

最好的方法是什么?有一个想法告诉我,我创建了另一个队列,我会将处理过的消息与处理器中的传递标记和通道引用一起推送到它。我将听取这个新的队列,并根据它做ack。

1 个答案:

答案 0 :(得分:0)

频道不是线程安全的 - 请参阅rabbitmq documentation

  

不得在线程之间共享通道实例。应用程序应该更喜欢每个线程使用一个Channel,而不是跨多个线程共享相同的Channel。虽然通道上的某些操作可以安全地同时调用,但有些操作并不会导致错误的帧交错。在线程之间共享通道也会干扰* Publisher Confirms。

您应该只在侦听器线程本身上使用ChannelAwareMessageListener公开的频道。

如果您尝试实现并发,通常最好使用容器的concurrentConsumers属性,而不是将消息传递给其他线程。