Как узнать, есть ли JMS Connection?

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

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

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

Ответы

Ответ 1

Ahhh... старая исключение/пересоединение.

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Единственный вариант в случае JMSException, основанного на подключении, заключается в попытке восстановить соединение в вашем обработчике исключений и повторить операцию.