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

时间:2019-01-06 17:51:35

标签: spring jms integration spring-jms

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

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

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

所以我的问题是:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  3. 请参阅#2。

  4. 使用DMLC,可在调用容器之前立即进行确认;设置sessionTransacted = true,以便在侦听器退出之前不提交确认。使用SimpleMessageListenerContainer,当侦听器退出时,该消息将被确认。有关差异,请参见DMLC和SMLC的Javadocs(以及它们的子类的抽象类)。