如何使用java和spring 3.0从JMS主题(而不是队列)同时处理多个消息?

Edg*_*les 14 java concurrency messaging spring jms

请注意,我希望多个消息侦听器同时处理来自主题的连续消息.此外,我希望每个消息监听器都以事务方式运行,以便给定消息监听器中的处理失败将导致该监听器的消息保留在该主题上.

Spring DefaultMessageListenerContainer似乎只支持JMS队列的并发性.

我是否需要实例化多个DefaultMessageListenerContainers?

如果时间沿垂直轴向下流动:

ListenerA reads msg 1        ListenerB reads msg 2        ListenerC reads msg 3
ListenerA reads msg 4        ListenerB reads msg 5        ListenerC reads msg 6
ListenerA reads msg 7        ListenerB reads msg 8        ListenerC reads msg 9
ListenerA reads msg 10       ListenerB reads msg 11       ListenerC reads msg 12
...
Run Code Online (Sandbox Code Playgroud)

更新:
感谢您的反馈@ T.Rob和@skaffman.

我最终做的是在消息监听器中创建多个DefaultMessageListenerContainerswith concurrency=1然后放入逻辑,以便只有一个线程处理给定的消息id.

ska*_*man 6

您不需要多个DefaultMessageListenerContainer实例,不需要,但您需要DefaultMessageListenerContainer使用以下concurrentConsumers属性将其配置为并发:

指定要创建的并发使用者数.默认值为1.

为此设置指定更高的值将增加运行时调度的并发使用者的标准级别:这实际上是将在任何给定时间安排的最小并发使用者数.这是一个静态设置; 对于动态缩放,请考虑指定"maxConcurrentConsumers"设置.

建议增加并发使用者的数量,以便扩展从队列进入的消息的消耗.但请注意,一旦多个消费者注册,任何订购保证都会丢失.一般来说,坚持使用1个消费者来进行低容量队列.

然而,底部有一个很大的警告:

不要为主题增加并发使用者的数量.这将导致同时消费同一消息,这几乎是不可取的.

这很有意思,当你想到它时就有意义了.如果您有多个DefaultMessageListenerContainer实例,也会发生同样的情况.

我想也许你需要重新考虑你的设计,虽然我不确定我的建议.同时消费发布/订阅消息似乎是一件非常合理的事情,但是如何避免同时向所有消费者传递相同的消息?