通过 JMS 与外部系统集成。集群环境

Integration with external systems over JMS. Clustered environment

我有一个应用程序,我在其中为外部系统 A 创建了 2 个消息侦听器容器,它们分别侦听两个队列。

我还有 1 个消息侦听器容器,运行 并侦听外部系统 B 的另一个队列。我正在使用 spring DefaultMessageListenerContainer。

我的应用程序在集群环境中 运行,在定义我的消息侦听器容器时,我向它注入了我的侦听器,它实现了 javax MessageListener 接口并充当一种 MDB。

所以我的问题是:

  1. 每个队列都有一个消息侦听器容器实例是否正常?
  2. 我的消息驱动的 pojo (MDP) 会在每个应用程序节点上执行 onMessage() 吗?
  3. 如果是,我该如何避免呢?我希望每条消息在某些应用程序节点上被消费一次。
  4. DefaultMessageListenerContainer 的默认行为是什么,在我到达 onMessage 或完成 onMessage 执行后立即确认消息?或者我可能需要手动确认?

请参阅 the spring framework JMS documentation 和 JMS 规范。

  1. 是的很正常-一个容器只能监听一个目的地。

  2. 这取决于目的地类型;对于一个主题,每个实例都会得到消息的副本;对于一个队列,多个监听器(消费者)会竞争消息。这与 Spring 无关,这是 JMS 的工作方式。

  3. 参见 #2。

  4. 使用 DMLC,在调用容器之前立即确认;设置 sessionTransacted = true 以便在侦听器退出之前不会提交 ack。使用 SimpleMessageListenerContainer,消息在侦听器退出时被确认。请参阅 DMLC 和 SMLC(以及它们的子类的抽象 类)的 Javadocs 以了解差异。