В JMS легко узнать, потеряно ли соединение, исключение происходит. Но как я узнаю, там ли соединение снова?
Сценарий: Я использую JMS для общения с моим сервером. Теперь мои повреждения соединения (сервер снижается), который приводит к исключению.Пока все хорошо. Если сервер возрос снова, и соединение восстановлено, как я знаю это?
Я не вижу Слушателей, которые упростили бы такую информацию.
А-а-а... старая проблема обработки исключений/переподключения.
Есть некоторые транспортные провайдеры, которые автоматически переподключат ваше приложение за вас, и некоторые, которые заставляют приложение управлять переподключением. Как правило, переподключение скрывает исключение от приложения. Недостатком является то, что вы не хотите, чтобы приложение зависло навсегда, если все удаленные узлы обмена сообщениями не работают, поэтому в конечном итоге вы должны включить некоторую логику переподключения.
Теперь самое интересное - как обрабатывать исключения нейтральным для провайдера способом? Исключение JMS практически бесполезно. Например, "исключение безопасности" может означать, что политики безопасности Java слишком ограничительны, что разрешения файловой системы слишком ограничены, что учетные данные LDAP не прошли, что соединение с транспортом не удалось, что открытие очереди или темы не удалось или любая из десятков других проблем, связанных с безопасностью. Именно связанное исключение, содержащее детали от поставщика транспорта, действительно помогает отладить проблему. Мои клиенты обычно используют один из трех различных подходов...
В вашем случае объекты очереди и темы, вероятно, действительны только в контексте исходного соединения. Если предположить, что провайдер переподключается автоматически, то факт, что вы получили исключение, означает, что переподключение не удалось, и контекст для объектов очереди и темы не может быть восстановлен. Закройте все объекты и восстановите соединение.
Хотите ли вы делать что-то более специфичное для провайдера, например, различать переходные и постоянные ошибки - это одна из тех вещей, которые "зависит от ситуации", и вам придется решать это в каждом конкретном случае.
Единственный вариант в случае JMSException на основе соединения - попытаться восстановить соединение в обработчике исключений и повторить операцию.
Спецификация JMS не описывает никаких транспортных протоколов, в ней ничего не говорится о соединениях (т.е. должен ли брокер поддерживать их в рабочем состоянии или устанавливать новое соединение для каждого сеанса). Итак, я думаю, что вы имеете в виду под
Теперь мое соединение разрывается (сервер не работает), что приводит к исключению.
заключается в том, что вы пытаетесь отправить сообщение и получаете исключение JmsException.
Я думаю, единственный способ узнать, работает ли брокер, - это попытаться отправить сообщение.