Как настроить прослушиватель сообщений Spring (MDP) на один экземпляр в кластере

У меня есть прослушиватель сообщений весны, настроенный с

<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 уведомления отправляются в очередь, оба слушателя работают, каждый получает уведомление, и оба выполняются параллельно. Это проблема, потому что уведомления должны обрабатываться последовательно.

Кажется, я не могу понять, как заставить его иметь только одного прослушивателя сообщений на кластер, а не на узел.

1 ответ

Я решил проблему, установив в очереди jms следующего потребителя, пока не вернется предыдущий. Я использую эту функцию на сервере weblogic, которая называется Unit of Order. В документации сказано, что вам просто нужно включить ее в очереди (я использовал хэш). Однако я обнаружил, что мне нужно включить его и на фабрике соединений и установить имя по умолчанию. Теперь я вижу MDP на узел, но 1 ждет 2 для завершения, прежде чем обрабатывать, и наоборот. Не то решение, которое я намеревался, но, тем не менее, оно работает. Несмотря на специфичность оракула, на самом деле он немного лучше, чем одно решение MDP.

Примечание: я не установил единицу имени заказа в весеннем производителе jmstemplate, поскольку я не знаю, возможно ли это. У меня есть weblogic, устанавливающий имя по умолчанию, когда производитель не предоставил ни одного.

Другие вопросы по тегам