Как узнать, есть ли соединение JMS? - PullRequest
19 голосов
/ 06 июля 2010

В JMS легко узнать, потеряно ли соединение, происходит ли исключение.Но как мне узнать, есть ли соединение снова?

Сценарий: я использую JMS для связи с моим сервером.Теперь мое соединение разрывается (сервер не работает), что приводит к исключению.Все идет нормально.Если сервер снова подключен и соединение восстановлено, как мне это узнать?

Я не вижу прослушивателей, которые могли бы получить такую ​​информацию.

Ответы [ 4 ]

16 голосов
/ 06 июля 2010

Аааа ... старая проблема обработки / восстановления исключений.

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

Теперь вот интересная часть - как вы обрабатываете исключения нейтральным способом поставщика?Исключение JMS практически ничего не стоит.Например, «исключение безопасности» может заключаться в том, что политики безопасности Java слишком ограничительны, что разрешения файловой системы слишком ограничены, что учетные данные LDAP не удалось, что не удалось подключиться к транспорту, что открыто очередь или разделне удалось или любой из десятков других проблем, связанных с безопасностью.Это связанное исключение, содержащее подробности от поставщика транспорта, которые действительно помогают отладить проблему.Мои клиенты обычно используют один из трех различных подходов ...

  1. Все ошибки обрабатываются одинаково.Закройте все объекты и переинициализируйте их.это переносимый JMS.
  2. Разрешить приложению проверять связанные исключения, чтобы различать фатальные и временные ошибки (т. е. ошибка аутентификации и переполнение очереди).Не переносится поставщиком.
  3. Классы обработки ошибок, зависящие от поставщика.Гибрид двух других.

В вашем случае объекты очереди и темы, вероятно, действительны только в контексте исходного соединения.Предполагая, что провайдер, который автоматически переподключается, факт, что вы получили исключение, означает, что переподключение не удалось, и контекст для объектов очереди и темы не может быть восстановлен.Закройте все объекты и переподключите.

Если вы хотите сделать что-то более специфичное для поставщика, такое как различие между временными и постоянными ошибками, это одна из тех вещей, которые "зависят", и вам придется выяснить это нав каждом конкретном случае.

6 голосов
/ 28 ноября 2014

Лучший способ отслеживать исключение соединения - это настроить прослушиватель исключения, например:

ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jmsContextName");
        connection = connectionFactory.createConnection();
        connection.setExceptionListener(new ExceptionListener() {
            @Override
            public void onException(JMSException exception) {
                logger.error("ExceptionListener triggered: " + exception.getMessage(), exception);
                try {
                    Thread.sleep(5000); // Wait 5 seconds (JMS server restarted?)
                    restartJSMConnection();
                } catch (InterruptedException e) {
                    logger.error("Error pausing thread" + e.getMessage());
                }
            }
        });
        connection.start();
4 голосов
/ 06 июля 2010

Спецификация JMS не описывает какой-либо транспортный протокол, она ничего не говорит о соединениях (т. Е. Должен ли брокер поддерживать их работу или устанавливать новое соединение для каждого сеанса).Итак, я думаю, что вы подразумеваете под

Теперь у меня разрывается соединение (сервер не работает), что приводит к исключению.

, что вы пытаетесь отправитьсообщение, и вы получаете JmsException.

Я думаю, единственный способ проверить, работает ли брокер, это попытаться отправить сообщение.

1 голос
/ 06 июля 2010

Ваша единственная опция в случае JMSException на основе соединения - попытаться восстановить соединение в обработчике исключений и повторить операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...