Необходимо ли обслуживание долгоживущих JMS-соединений?

Я всегда держу соединение JMS открытым, потому что на нем есть MessageListener.

Часто ли приходится беспокоиться о минимизации обслуживания приложений с долгоживущими соединениями JMS?

Я думал о чем-то вроде попытки восстановиться после некоторых возможных широко известных типов сбоев, таких как временный сбой подключения.


person João    schedule 04.12.2008    source источник


Ответы (3)


Насколько я знаю, в стандартной спецификации JMS нет ничего, что гарантировало бы, что проблемы с подключением не будут видны приложению. Возможно, есть некоторые поставщики, которые делают это как расширение (как предлагает Джеймс Страчан).

Если вам нужен надежный JMS-клиент, не зависящий от расширений поставщика, вам необходимо обрабатывать ошибки и выполнять повторное подключение. См. раздел Повторное подключение прослушивателя JMS к JBossMQ (что, несмотря на название, не является зависит от JBossMQ).

person John M    schedule 04.12.2008

Хороший провайдер JMS будет иметь дело с сбоями в сети, такими как отброшенный сокет или сбой или перезагрузка брокера сообщений. например вот как вы включаете автоматическое повторное подключение в Apache ActiveMQ.

Часто бывает довольно сложно воссоздать все ваши ресурсы JMS (соединение, сеансы, производители, потребители) - провайдеру JMS гораздо проще сделать это за вас.

Если вы должны использовать поставщика, который не может поддерживать эту функцию, подумайте о том, чтобы либо переключиться, либо использовать вспомогательные классы Spring JMS, которые могут сделать это за вас.

person James Strachan    schedule 04.12.2008

Вам нужно будет обрабатывать два случая:

  1. Брандмауэр между вами и сервером JMS. Большинство брандмауэров отключают «неактивное» соединение через пару часов. Если это так, отправляйте сообщение каждый час или около того или, если можете, включите TCP_KEEPALIVE. Это опция TCP/IP, которая заставит базовый сокет отправить тестовое сообщение через некоторое время.
  2. Другой сервер перезагружен. Когда это произойдет, вы получите сообщение об ошибке «соединение потеряно» при попытке отправить следующее сообщение. В этом случае просто откройте соединение еще раз и повторите попытку.

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

person Aaron Digulla    schedule 04.12.2008