Повторное подключение слушателя JMS к JBossMQ
У нас есть слушатель Java, который читает текстовые сообщения из очереди в JBossMQ. Если нам нужно перезагрузить JBoss, слушатель не будет переподключаться и снова начнет читать сообщения. Мы просто получаем сообщения в файле журнала слушателя каждые 2 минуты, в которых говорится, что он не может подключиться. Есть ли что-то, что мы не устанавливаем в нашем коде или в JBossMQ? Я новичок в JMS, поэтому любая помощь будет принята с благодарностью. Благодарю.
4 ответа
Вы должны реализовать в своем клиентском коде 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/Naming/ и т.д. исключения.
Мы использовали этот метод в течение многих лет с JBossMQ, и он прекрасно работает. У нас никогда не было проблем с тем, чтобы наши клиенты JMS не переподключались после восстановления JBossMQ или потери нашего сетевого подключения.
Я настоятельно рекомендую вам использовать абстракции Spring для JMS, такие как MessageListenerContainer, чтобы иметь дело с переподключением, транзакциями и пулами для вас. Вам просто нужно предоставить MessageListener и настроить MessageListenerContainer с помощью ConnectionFactory, а контейнер сделает все остальное.
Если вы просто слушатель и не делаете никаких других вызовов JMS, кроме настройки соединения, тогда ответ "обработчик onException()" является правильным.
Если вы делаете какие-либо вызовы JMS в своем коде, просто использование обратного вызова onException() недостаточно. Проблемы передаются от провайдера JMS в приложение либо через исключение при вызове метода JMS, либо через обратный вызов onException(). Не оба.
Поэтому, если вы вызываете какие-либо методы JMS из своего кода, вы также захотите вызвать эту логику переподключения, если вы получите какие-либо исключения для этих вызовов.
Совет из личного опыта. Обновление до JBoss Messaging. Я видел это в производстве в течение 4 месяцев без проблем. Он имеет полностью прозрачное переключение при сбое - среди многих других функций.
Кроме того, если вы используете Spring, будьте очень осторожны с JmsTemplate.