Повторное подключение прослушивателя JMS к JBossMQ
Вопрос
У нас есть прослушиватель Java, который читает текстовые сообщения из очереди в JBossMQ.Если нам придется перезагрузить JBoss, прослушиватель не сможет повторно подключиться и снова начать читать сообщения.Мы просто получаем сообщения в файле журнала прослушивателя каждые 2 минуты о том, что он не может подключиться.Есть ли что-то, что мы не настраиваем в нашем коде или в JBossMQ?Я новичок в JMS, поэтому буду очень признателен за любую помощь.Спасибо.
Решение
Вам следует реализовать в своем клиентском коде javax.jms.ExceptionListener.Вам понадобится метод onException.Когда соединение клиента потеряно, вы должны получить JMSException, и этот метод будет вызван автоматически.Единственное, на что вам следует обратить внимание, это если вы намеренно отключаетесь от JBossMQ, это также вызовет исключение.
Некоторый код может выглядеть так:
public void onException (JMSException jsme)
{
if (!closeRequested)
{
this.disconnect();
this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector);
}
else
{
//Client requested close so do not try to reconnect
}
}
Затем в вашем коде «installConnection» вы должны реализовать while(!initialized)
конструкция, содержащая внутри себя try/catch.Пока вы не уверены, что подключились и подписались правильно, оставайтесь в цикле while, перехватывая все JMS/именования и т. д.исключения.
Мы уже много лет используем этот метод с JBossMQ, и он отлично работает.У нас никогда не возникало проблем с тем, чтобы наши JMS-клиенты не переподключались после отключения JBossMQ или потери сетевого подключения.
Другие советы
Я настоятельно рекомендую вам использовать Spring абстракции для JMS, такие как MessageListenerContainer. чтобы справиться с переподключением, транзакциями и объединением за вас.Вам просто нужно предоставить MessageListener и настроить MessageListenerContainer с помощью ConnectionFactory, а контейнер сделает все остальное.
Если вы просто слушатель и делаете нет другие вызовы JMS, кроме настройки соединения, тогда ответ «обработчик onException()» правильный.
Если вы выполняете какие-либо вызовы JMS в своем коде, простого использования обратного вызова onException() недостаточно.Проблемы передаются от поставщика JMS в приложение. или через исключение при вызове метода JMS или через обратный вызов onException().Не оба.
Поэтому, если вы вызываете какие-либо методы JMS из своего кода, вам также потребуется вызвать эту логику переподключения, если вы получите какие-либо исключения при этих вызовах.
Совет из личного опыта. Обновитесь до Обмен сообщениями JBoss. Я видел его в производстве уже 4 месяца без проблем.Помимо многих других функций, он имеет полностью прозрачное аварийное переключение.
Кроме того, если вы предпочитаете Spring, будьте очень осторожный с JmsШаблон.