Интеграция с внешними системами через JMS. Кластерная среда - PullRequest
0 голосов
/ 06 января 2019

У меня есть приложение, в котором я создал 2 контейнера прослушивателей сообщений для внешней системы A, которые слушают две очереди соответственно.

Также у меня есть 1 контейнер приемника сообщений, который запускает и прослушивает другую очередь внешней системы B. Я использую Spring DefaultMessageListenerContainer.

Мое приложение работает в кластерной среде, при определении контейнера прослушивателя сообщений я внедрил в него свой прослушиватель, который реализует интерфейс javax MessageListener и действует как своего рода MDB.

Итак, мои вопросы:

  1. Нормально ли иметь экземпляр контейнера прослушивателя сообщений в очереди?
  2. Будет ли мой pojo (MDP), управляемый сообщениями, выполняться onMessage () на каждом узле приложения?
  3. Если да, как я могу избежать этого? Я хочу, чтобы каждое сообщение использовалось один раз на некоторых узлах приложения.
  4. Каково поведение по умолчанию DefaultMessageListenerContainer, сообщение подтверждается, как только я достиг onMessage или после того, как я закончил выполнение onMessage? Или, может быть, мне нужно подтвердить это вручную?

1 Ответ

0 голосов
/ 06 января 2019

См. документацию JMS по структуре пружины и спецификацию JMS.

  1. Да, это нормально - контейнер может прослушивать только один пункт назначения.

  2. Это зависит от типа пункта назначения; по теме каждый экземпляр получит копию сообщения; за очередь несколько слушателей (потребителей) будут бороться за сообщения. Это не имеет ничего общего с Spring, так работает JMS.

  3. См. № 2.

  4. С DMLC это подтверждается непосредственно перед вызовом контейнера; установите sessionTransacted = true, чтобы подтверждение не было зафиксировано до тех пор, пока слушатель не выйдет. При SimpleMessageListenerContainer сообщение считается подтвержденным при выходе из прослушивателя. См. Javadoc для DMLC и SMLC (а также абстрактные классы, которые они подклассируют) для различий.

...