Вопрос или проблема
Мое приложение использует MQ Java клиент 9.0.4.0 для MQ сервера 9.1.0.* В некоторых случаях, когда MQ сервер отключен, мой MQ клиент начинает выбрасывать непрерывные исключения. Я ищу, какие настройки клиента можно использовать, чтобы избежать таких сценариев, когда непрерывные исключения заполняют журнал и пространство на диске, если их не заметить.
Ниже приведены основные детали исключений – есть немного больше с длинными обернутыми деталями исключений, которые здесь не упоминаются.
202x-xx-13 15:18:17,521 ОШИБКА [com.xxx.fixengine.jms.client.consumer.dClient~JmsConsumer~xxx.BW_TMATCH.CAM.ALLOC] [com.xxx.fixengine.jms.client.consumer.d] Ошибка при обработке сообщения: ошибка – JMSWMQ2002: Не удалось получить сообщение из назначения ‘xxx.BW_TMATCH.CAM.ALLOC’.
com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009
2024-xx-13 15:18:17,521 ИНФО [com.xxx.fixengine.jms.client.consumer.dClient~JmsConsumer~xxx.BW_TMATCH.CAM.ALLOC] [com.xxx.fixengine.jms.client.a.b] Откат transactionContext: null
2024-xx-13 15:18:17,522 ПРЕДУПРЕЖДЕНИЕ [com.xxx.fixengine.jms.client.consumer.dClient~JmsConsumer~xxx.BW_TMATCH.CAM.ALLOC] [com.xxx.fixengine.jms.client.consumer.d] Неудачный откат транзакции
com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009
MQ клиент как очередь подключается с базовыми аргументами и ниже в качестве фабрики соединений используется com.rbs.gbm.futures.stp.fix.jms.ConfigurableMQQueueConnectionFactory
В случае, если MQ сервер отключается, мой MQ клиент начинает выбрасывать непрерывные исключения, пока сервер снова не восстановится сам по себе.
Я ищу некоторые настройки клиента или изменения в API, которые остановили бы эти исключения из-за сбоя, и это должно контролироваться либо ограниченным числом раз, либо вообще не контролироваться.
Ответ или решение
Решение проблемы с исключениями MQ Client при недоступности сервера
Когда ваш Java клиент обмена сообщениями (MQ Client) сталкивается с возникающей ситуацией, когда сервер MQ временно недоступен (например, из-за сбоев или планового обслуживания), это может привести к непрерывному возникновению исключений. Отлаживание таких ошибок — важная задача для обеспечения стабильной работы приложения и предотвращения переполнения логов. В данной статье мы рассмотрим, как можно минимизировать и контролировать выбросы исключений в случае недоступности сервера.
Понимание проблемы
Согласно вашему описанию, ваша система использует MQ клиента версии 9.0.4.0 для подключения к серверу версии 9.1.0.*. Когда сервер MQ недоступен, вы наблюдаете бросание исключений, таких как:
- JMSWMQ2002: Failed to get a message from destination
- Rollback transactionContext: null
- Failed transaction rollback
Однако, важно понимать, что причина, по которой клиент продолжает генерировать исключения, заключается в настройках вашей клиентской конфигурации и обработке ошибок вашего кода.
Рекомендованные настройки клиента
-
Установите параметры повторных попыток подключения:
Настройтеreconnect
для уменьшения числа попыток подключения, когда сервер недоступен. Например:connectionFactory.setReconnectAttempts(5); // Максимальное количество попыток подключения connectionFactory.setReconnectDelay(1000); // Задержка между попытками в миллисекундах
-
Используйте параметры тайм-аута:
Установите тайм-ауты для операций отправки и получения сообщений. Это поможет избежать длительного ожидания в случае потери соединения:connectionFactory.setReceiveTimeout(5000); // Тайм-аут при ожидании сообщения connectionFactory.setSendTimeout(5000); // Тайм-аут при отправке сообщения
-
Логирование исключений:
Применяйте механизм логирования, чтобы контролировать количество записей об исключениях. Например, создайте счетчик, который будет отслеживать количество исключений и очистьте лог после определенного порога:int exceptionCount = 0; final int MAX_EXCEPTIONS = 10; try { // Код получения сообщения } catch (JmqiException e) { exceptionCount++; if (exceptionCount > MAX_EXCEPTIONS) { log.warn("Достигнуто максимальное количество исключений. Логирование отключено."); } else { log.error("Ошибка подключения к серверу: ", e); } }
-
Непрерывное мониторинг состояния соединения:
Внедрите механизм для проверки состояния соединения. Это позволит вам реагировать на сбои, например, переключаясь на резервный сервер или уведомляя администратора. -
Реализация обработчиков ошибок:
Замените стандартные механизмы обработки ошибок на пользовательские. Перехватывайте исключения и обрабатывайте их, вместо того чтобы позволять логике приложения прерываться:try { // Ваш код извлечения сообщения } catch (JmqiException e) { handleException(e); // Ваша собственная логика обработки }
-
Снижение уровня логирования:
В случаях, когда сервер MQ недоступен, возможно, есть смысл в снижении уровня логирования (например, до INFO или WARN) для уменьшения количества записей об исключениях.
Заключение
Проблема с постоянными исключениями при недоступности сервера MQ может быть минимизирована путем правильной настройки конфигурации клиента и применения эффективных методов обработки ошибок. Важно понимать, что простые изменения в вашем коде могут существенно улучшить стабильность и производительность приложения. Рекомендуем вам протестировать предложенные изменения, чтобы определить их эффективность в вашем конкретном случае. Успехов в оптимизации вашего Java клиента MQ!