Управление контейнерами сообщений JMS при запуске и завершении работы приложения - PullRequest
0 голосов
/ 25 марта 2019

В настоящее время у нас есть четыре контейнера слушателя JMS, которые запускаются во время запуска приложения.Все они подключаются через Apache ZooKeeper и запускаются вручную.Это становится проблематичным, когда невозможно установить соединение с ZooKeeper.Приложение (Wicket) не может запуститься, даже если прослушивателям JMS не нужно активно использовать приложение.Им просто нужно прослушивать сообщения в фоновом режиме, сохранять их, и задание cron будет обрабатывать их партиями.

Цели :

  1. Разрешить приложениюзапускать и не препятствовать тому, чтобы контейнеры сообщений не могли подключиться.
  2. После запуска приложения запустите прослушиватели сообщений.
  3. Если подключение к одному или любому из прослушивателей сообщений оборвется, он должен попытаться автоматически переподключиться.
  4. При завершении работы приложения (например, при закрытии Tomcat) приложение должно остановить прослушиватели сообщений и задание cron, которое обрабатывает сохраненные сообщения.
  5. Makeвсе это тестируемое (например, возможность писать интеграционные тесты для этой установки).

Текущая настройка :

  1. Spring Boot 1.5.6
  2. Apache ZooKeeper 3.4.6
  3. Apache ActiveMQ 5.7
  4. Калитка 7.7.0

Работа, проделанная до настоящего времени :

  1. Определите класс, которыйреализует ApplicationListener<ApplicationReadyEvent>.
  2. Установка для свойства autoStart DefaultMessageListenerContainer значения false и запуск каждого контейнера в onApplicationEvent в отдельном потоке.

Вопросы :

  1. Необходимо ли запускать каждый контейнер сообщений в отдельном потоке?Это кажется излишним, но способ «запуска» процесса заключается в том, что DefaultMessageListenerContainer создается для этого слушателя, а затем запускается.Существует компонент пользовательского интерфейса, который пользователь может использовать для запуска / остановки прослушивателей сообщений, если это необходимо, и если они запускаются последовательно в одном потоке, то последние три контейнера сообщений могут быть нулевыми, если первый еще не подключился при запуске.
  2. Как мне достичь целей 4 и 5?

Конечно, любые замечания о том, нахожусь ли я на правильном пути, были бы полезны.

1 Ответ

0 голосов
/ 26 марта 2019

Если вы не запустите их в пользовательском потоке, тогда не удастся полностью запустить приложение целиком. Это не просто Wicket, а контейнер сервлетов не изменит состояние приложения с STARTING на STARTED из-за запроса на блокировку ZooKeeper.

Другой вариант - использовать неблокирующий запрос к ZooKeeper, но это делается клиентом JMS (ActiveMQ), поэтому вам необходимо проверить, поддерживается ли это в их документах (ActiveMQ и ZooKeeper). Я не использовал их в течение нескольких лет, поэтому я не могу помочь вам больше.

...