通过 JMS 与外部系统集成。集群环境
Integration with external systems over JMS. Clustered environment
我有一个应用程序,我在其中为外部系统 A 创建了 2 个消息侦听器容器,它们分别侦听两个队列。
我还有 1 个消息侦听器容器,运行 并侦听外部系统 B 的另一个队列。我正在使用 spring DefaultMessageListenerContainer。
我的应用程序在集群环境中 运行,在定义我的消息侦听器容器时,我向它注入了我的侦听器,它实现了 javax MessageListener 接口并充当一种 MDB。
所以我的问题是:
- 每个队列都有一个消息侦听器容器实例是否正常?
- 我的消息驱动的 pojo (MDP) 会在每个应用程序节点上执行 onMessage() 吗?
- 如果是,我该如何避免呢?我希望每条消息在某些应用程序节点上被消费一次。
- DefaultMessageListenerContainer 的默认行为是什么,在我到达 onMessage 或完成 onMessage 执行后立即确认消息?或者我可能需要手动确认?
请参阅 the spring framework JMS documentation 和 JMS 规范。
是的很正常-一个容器只能监听一个目的地。
这取决于目的地类型;对于一个主题,每个实例都会得到消息的副本;对于一个队列,多个监听器(消费者)会竞争消息。这与 Spring 无关,这是 JMS 的工作方式。
参见 #2。
使用 DMLC,在调用容器之前立即确认;设置 sessionTransacted = true
以便在侦听器退出之前不会提交 ack。使用 SimpleMessageListenerContainer
,消息在侦听器退出时被确认。请参阅 DMLC 和 SMLC(以及它们的子类的抽象 类)的 Javadocs 以了解差异。
我有一个应用程序,我在其中为外部系统 A 创建了 2 个消息侦听器容器,它们分别侦听两个队列。
我还有 1 个消息侦听器容器,运行 并侦听外部系统 B 的另一个队列。我正在使用 spring DefaultMessageListenerContainer。
我的应用程序在集群环境中 运行,在定义我的消息侦听器容器时,我向它注入了我的侦听器,它实现了 javax MessageListener 接口并充当一种 MDB。
所以我的问题是:
- 每个队列都有一个消息侦听器容器实例是否正常?
- 我的消息驱动的 pojo (MDP) 会在每个应用程序节点上执行 onMessage() 吗?
- 如果是,我该如何避免呢?我希望每条消息在某些应用程序节点上被消费一次。
- DefaultMessageListenerContainer 的默认行为是什么,在我到达 onMessage 或完成 onMessage 执行后立即确认消息?或者我可能需要手动确认?
请参阅 the spring framework JMS documentation 和 JMS 规范。
是的很正常-一个容器只能监听一个目的地。
这取决于目的地类型;对于一个主题,每个实例都会得到消息的副本;对于一个队列,多个监听器(消费者)会竞争消息。这与 Spring 无关,这是 JMS 的工作方式。
参见 #2。
使用 DMLC,在调用容器之前立即确认;设置
sessionTransacted = true
以便在侦听器退出之前不会提交 ack。使用SimpleMessageListenerContainer
,消息在侦听器退出时被确认。请参阅 DMLC 和 SMLC(以及它们的子类的抽象 类)的 Javadocs 以了解差异。