1

我有一个配置为弹簧消息侦听器

<bean id="processListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="concurrentConsumers" value="1"/>
  <property name="clientId" value="process-execute"/>
  <property name="connectionFactory" ref="topicConnectionFactory"/>
  <property name="destination" ref="processExecuteQueue"/>
  <property name="messageListener" ref="processExecuteListener"/>
</bean>

这是在具有 2 个节点的集群上运行的。我看到它为每个节点创建了 1 个消费者,而不是每个集群创建了 1 个消费者。它们都配置了上述 xml,因此它们具有相同的 clientId。然而,当 2 个通知发布到队列时,两个侦听器都在运行,每个侦听器都收到一个通知,并且都并行执行。这是一个问题,因为通知需要按顺序处理。

我似乎不知道如何使它每个集群而不是每个节点只有一个消息侦听器。

4

1 回答 1

0

我通过让 jms 队列阻塞下一个消费者直到前一个消费者返回来解决了这个问题。这是我正在使用的 weblogic 服务器中的一项功能,称为订单单元。文档说你只需要在队列上启用它(我使用哈希)。但是,我发现我还需要在连接工厂上启用它并设置默认名称。现在我看到每个节点都有一个 MDP,但是 1 在处理之前等待 2 完成,反之亦然。不是我想要的解决方案,但它仍然有效。虽然特定于 oracle,但它实际上比单个 MDP 解决方案要好一些。

注意:我没有在 spring jmstemplate 生产者中设置订单单位名称,因为我不知道这是否可能。当生产者未提供任何名称时,我让 weblogic 设置了默认名称。

于 2014-08-16T21:25:49.200 回答