Повторное подключение слушателя JMS к JBossMQ - PullRequest
13 голосов
/ 06 сентября 2008

У нас есть слушатель Java, который читает текстовые сообщения из очереди в JBossMQ. Если нам потребуется перезагрузить JBoss, слушатель не будет переподключаться и снова начнет читать сообщения. Мы просто получаем сообщения в файле журнала слушателя каждые 2 минуты, в которых говорится, что он не может подключиться. Есть ли что-то, что мы не устанавливаем в нашем коде или в JBossMQ? Я новичок в JMS, поэтому любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 4 ]

10 голосов
/ 07 сентября 2008

Вы должны реализовать в своем клиентском коде 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
        }
    }

В вашем коде "createConnection" вы реализуете конструкцию while(!initialized), которая содержит внутри себя попытку / улов. Пока вы не уверены, что подключились и подписались правильно, оставайтесь в цикле while, перехватывая все JMS / Naming / etc. исключения.

Мы годами использовали этот метод с JBossMQ, и он прекрасно работает. У нас никогда не было проблем с тем, чтобы наши клиенты JMS не переподключались после восстановления JBossMQ или потери нашего сетевого подключения.

8 голосов
/ 16 сентября 2008

Я настоятельно рекомендую вам использовать абстракции Spring для JMS, такие как MessageListenerContainer , чтобы иметь дело с переподключением, транзакциями и пулами для вас. Вам просто нужно предоставить MessageListener и настроить MessageListenerContainer с помощью ConnectionFactory, а контейнер сделает все остальное.

6 голосов
/ 23 сентября 2008

Если вы просто слушатель и делаете нет других вызовов JMS, кроме настройки соединения, тогда ответ «обработчик onException ()» верен.

Если вы делаете какие-либо вызовы JMS в своем коде, просто использование обратного вызова onException () недостаточно. Проблемы передаются от провайдера JMS в приложение или через исключение при вызове метода JMS или через обратный вызов onException (). Не оба.

Поэтому, если вы вызываете какие-либо методы JMS из своего кода, вы также захотите вызвать эту логику переподключения, если вы получите какие-либо исключения для этих вызовов.

1 голос
/ 23 сентября 2008

Советы из личного опыта. Обновление до JBoss Messaging . Я видел его в работе 4 месяца без проблем. Он имеет полностью прозрачное аварийное переключение - среди многих других функций.

Кроме того, если вы используете Spring, будьте очень осторожными с JmsTemplate .

...