Ahhh ... старая обработка исключений/пересоединение.
Есть некоторые поставщики транспорта, которые автоматически подключат ваше приложение к вам и к тем, кто заново подключит приложение. В общем случае пересоединения скрывают исключение из приложения. Нижняя сторона заключается в том, что вы не хотите, чтобы приложение зависало вечно, если все удаленные узлы обмена сообщениями так опущены, что в конечном счете вы должны включать некоторую логику пересоединения.
Теперь вот интересная часть - как вы обрабатываете исключения в нейтральном режиме провайдера? Исключение JMS практически бесполезно. Например, «исключение безопасности» может быть в том, что политики безопасности Java слишком ограничены, что разрешения файловой системы слишком ограничены, что учетные данные LDAP не удались, что соединение с транспортом завершилось неудачно, что открытие очереди или темы не удалось или какой-либо из десятков других проблем, связанных с безопасностью. Это связанное исключение, в котором есть данные от поставщика транспорта, которые действительно помогают отладить проблему. Мои клиенты обычно использовали один из трех разных подходов здесь:
- Рассматривайте все ошибки одинаково. Закройте все объекты и повторите их инициализацию. это JMS portable.
- Разрешить приложению проверять связанные исключения, чтобы различать фатальные и временные ошибки (то есть ошибка аутентификации по сравнению с полной очередью). Не поставщик портативный.
- Специфичные для поставщика классы обработки ошибок. Гибрид двух других.
В вашем случае объекты очереди и темы, вероятно, действительны только в контексте исходного соединения. Предполагая, что провайдер, который автоматически подключится к тому факту, что вы получили исключение, означает, что пересоздание завершилось неудачно, и контекст для объектов очереди и темы не удалось восстановить. Закройте все объекты и снова подключите их.
Если вы хотите сделать что-то более специфичное для провайдера, например, различать переходные и постоянные ошибки, это одно из тех, «зависящих» от вещей, и вам придется разобраться с этим в каждом конкретном случае.
Дело в том, что если у меня есть, скажем, клиент GUI, который обменивается данными через JMS с сервером, просто не имеет смысла заливать очередь сообщениями, которые нельзя обрабатывать в любом случае, потому что сервер не работает. Поэтому я предполагаю, что единственным реалистичным вариантом было бы отправить «ping» с интервалом (с низким ttl), чтобы проверить, возможно ли (или снова) общаться с сервером. Это подход, который вы бы рекомендовали? – Mauli
Это общий подход. Например, WebSphere MQ Explorer будет обновлять свое подключение к диспетчеру очереди каждые 15 секунд по умолчанию. Если вызов API завершается неудачно, в клиенте запускается пересоединение. Если это сработает, GUI просто займет дополнительную секунду, чтобы ответить. Если это не удается, GUI получает исключение и управляет своей собственной логикой повторного подключения. В случае приложений я обычно советую людям проектировать вызовы инструментальных средств в их API, например, не-транзакционный «пинг» именно по этой причине. –