2015-04-07 77 views
1

春季兔子可以在单一主题上支持多个并发消费者吗?春季兔子的每个主题的并发消费者

下面是详细信息

我的系统使用手册ACK模式通过弹簧的兔子的话题交换(春季4.0.6)。所述图案如下:

  • 消息进入ChannelAwareMessageListener
  • 工厂方法产生一个适当的工人,并传递到信道
  • 如果工人成功处理该消息的引用,该消息是确认” d
  • 如果工人是不成功或异常情况发生时,该消息是Nack'd和送入死信队列用于以后的处理

由于其中的一些工作人员可以花费相当多的时间来完成他们的IO绑定处理,我需要能够设置更多的并发用户。

但经过一番测试后,我发现有时候有几个消费者收到同样的消息。果然,一看文档(http://docs.spring.io/spring-framework/docs/4.0.6.RELEASE/javadoc-api/org/springframework/jms/listener/DefaultMessageListenerContainer.html#setConcurrentConsumers-int-),印证了我的发现:

不要提高并发用户的数量的话题,除非供应商特定的设置措施明确允许它。通过定期设置,这将导致同时消费同一消息,这几乎不可取。

我的问题如下:

  1. 这到底是什么“除非供应商特定的设置措施明确允许它”是什么意思?有补丁/版本/配置还是支持这个的兔子?
  2. 我可以很容易地在客户端编写代码,防止消息被其他工作人员处理时处理消息。那么,我该怎么处理这个信息呢?发送nack?忽略它?如果我nack,然后实际处理消息的工作人员在一段时间之后发送ack会发生什么情况?会抛出异常吗?

在此先感谢...

回答

1

你mentionned的警告是关于JMS不RabbitMQ的。看看Spring RabbitMQ documentation。该文档不包含此警告。

一旦消息传递到队列(无论交换类型如何),它可以由消费者/工作人员一次只有一次(假设没有问题)。

如果收到同一消息两次是在某个地方的问题:

  • 消息被NACKED和重新排队
  • 通道/连接的客户端上的封闭
  • 存在网络问题,兔子自动将消息(服务器和客户端上的通道/连接关闭)

对于最后两点,您应该得到一些错误消息年龄。

注意这一点是在我看来不必要的,并且可以解释该问题:

  • 工厂方法产生一个适当的工人和通过在一个 参考信道

SimpleMessageListenerContainer已经使用Executor。由于您使用自己的执行程序,因此spring-amqp渠道池(如果使用任何)和您的执行程序之间可能存在问题。该通道已关闭,因为spring-amqp认为它不再使用。

不是产生自己的线程,而是在当前线程的同一线程上处理消息。

相关问题