Как узнать, там ли Соединение JMS?

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

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

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

19
задан Mauli 6 July 2010 в 15:56
поделиться

3 ответа

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

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

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

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

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

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

16
ответ дан 30 November 2019 в 04:15
поделиться

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

1
ответ дан 30 November 2019 в 04:15
поделиться

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

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

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

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

4
ответ дан 30 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: