Клиентская очередь MQ потребителя вызывает постоянное исключение, так как сервер MQ не работает.

Вопрос или проблема

Мое приложение использует 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

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

Рекомендованные настройки клиента

  1. Установите параметры повторных попыток подключения:
    Настройте reconnect для уменьшения числа попыток подключения, когда сервер недоступен. Например:

    connectionFactory.setReconnectAttempts(5); // Максимальное количество попыток подключения
    connectionFactory.setReconnectDelay(1000); // Задержка между попытками в миллисекундах
  2. Используйте параметры тайм-аута:
    Установите тайм-ауты для операций отправки и получения сообщений. Это поможет избежать длительного ожидания в случае потери соединения:

    connectionFactory.setReceiveTimeout(5000); // Тайм-аут при ожидании сообщения
    connectionFactory.setSendTimeout(5000); // Тайм-аут при отправке сообщения
  3. Логирование исключений:
    Применяйте механизм логирования, чтобы контролировать количество записей об исключениях. Например, создайте счетчик, который будет отслеживать количество исключений и очистьте лог после определенного порога:

    int exceptionCount = 0;
    final int MAX_EXCEPTIONS = 10;
    
    try {
       // Код получения сообщения
    } catch (JmqiException e) {
       exceptionCount++;
       if (exceptionCount > MAX_EXCEPTIONS) {
           log.warn("Достигнуто максимальное количество исключений. Логирование отключено.");
       } else {
           log.error("Ошибка подключения к серверу: ", e);
       }
    }
  4. Непрерывное мониторинг состояния соединения:
    Внедрите механизм для проверки состояния соединения. Это позволит вам реагировать на сбои, например, переключаясь на резервный сервер или уведомляя администратора.

  5. Реализация обработчиков ошибок:
    Замените стандартные механизмы обработки ошибок на пользовательские. Перехватывайте исключения и обрабатывайте их, вместо того чтобы позволять логике приложения прерываться:

    try {
       // Ваш код извлечения сообщения
    } catch (JmqiException e) {
       handleException(e); // Ваша собственная логика обработки
    }
  6. Снижение уровня логирования:
    В случаях, когда сервер MQ недоступен, возможно, есть смысл в снижении уровня логирования (например, до INFO или WARN) для уменьшения количества записей об исключениях.

Заключение

Проблема с постоянными исключениями при недоступности сервера MQ может быть минимизирована путем правильной настройки конфигурации клиента и применения эффективных методов обработки ошибок. Важно понимать, что простые изменения в вашем коде могут существенно улучшить стабильность и производительность приложения. Рекомендуем вам протестировать предложенные изменения, чтобы определить их эффективность в вашем конкретном случае. Успехов в оптимизации вашего Java клиента MQ!

Оцените материал
Добавить комментарий

Капча загружается...