Повторное подключение прослушивателя JMS к JBossMQ

StackOverflow https://stackoverflow.com/questions/47683

  •  09-06-2019
  •  | 
  •  

Вопрос

У нас есть прослушиватель 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Шаблон.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top