Обработка ошибок соединения во время JmsTemplate.send с IBM MQ - PullRequest
0 голосов
/ 26 декабря 2018

Я использую метод отправки Spring Framework для отправки сообщения в очередь IBM.С CachingConnectionFactory для reconnectOnException установлено значение true.Мы наблюдали два случая, когда во время обычной загрузки MQ-сервер внезапно отключался, и операция отправки начала выдавать MQRC_CONNECTION_BROKEN code:2009 (Expected).Но даже после того, как сервер был запущен, отправка все еще не работала, и после перезапуска tomcat проблема была исправлена.Для обработки этого сценария мы изменили операцию отправки, чтобы иметь логику повторения, как показано в фрагменте № 2.Здесь я делаю явное resetConnection, чтобы убедиться, что после того, как сервер будет запущен, отправка пройдет.

Вопрос 1: С этим новым кодом значительное время ожидания для каждого потока отправителя вызывает другое приложениевопрос.70% потоков заблокированы в точке ниже, среднее время ожидания 8 минут.Как сократить время ожидания?

Вопрос 2: Есть ли лучший способ обработки ошибок после появления MQ?У нас установлен receonnectOptions, но это не помогло.

Фрагмент кода # 1 используется для инициализации фабрики соединений.

Фрагмент кода # 2 изменяет логику отправки с повтором и указывает, гдепотоки заблокированы.

Фрагмент кода # 3 - это исключения, которые мы видели после запуска MQ.После перезагрузки кота отправка работала нормально.В связи с этой проблемой было предложено исправление во фрагменте № 2.

Фрагмент № 2: измененная логика отправки с повторной попыткой.

    public void send(final Destination destination, final MessageCreator messageCreator) {

        try {

            jmsTemplate.send(destination, messageCreator);
            LOGGER.info("message sent to destination: {}...", destination);

        } catch (JmsException jmsException) {

            // Check if exception is specific for connection issue
            if (isConnectionSpecificException(jmsException)) {
                if (resetConnectionLock.tryLock(100, TimeUnit.MILLISECONDS)) {
                    // Reset connection
                    cachingConnectionFactory.resetConnection();
                    cachingConnectionFactory = new CachingConnectionFactory(connectionFactory);
                    cachingConnectionFactory.setSessionCacheSize(jmsContextResolver.getSendSessionCacheSize());
                    jmsTemplate.setConnectionFactory(cachingConnectionFactory);

                }

            }
            // Try resend
            jmsTemplate.send(destination, messageCreator);

        }
    }
}

Скод выше, потоки здесь блокируются на 8-10 минут:

org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.localStop(SingleConnectionFactory.java:640)
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.invoke(SingleConnectionFactory.java:577)
at com.sun.proxy.$Proxy122.close(Unknown Source)
at org.springframework.jms.connection.ConnectionFactoryUtils.releaseConnection(ConnectionFactoryUtils.java:80)

Фрагмент # 1:

final JmsFactoryFactory jmsFactoryFactory = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
final JmsConnectionFactory imqConnectionFactory = jmsFactoryFactory.createConnectionFactory();
imqConnectionFactory.setStringProperty(WMQConstants.WMQ_HOST_NAME, brokerInfo.getHost());
imqConnectionFactory.setIntProperty(WMQConstants.WMQ_PORT, Integer.valueOf(brokerInfo.getPort()));
imqConnectionFactory.setStringProperty(WMQConstants.WMQ_CHANNEL, brokerInfo.getChannel());
imqConnectionFactory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
imqConnectionFactory.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, brokerInfo.getQueueMgrName());
// ALSO TRIED WITH CLIENTRECONNECTOPTIONS SET. BUT DID NOT HELP.

Фрагмент # 3:

Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203) ~[com.ibm.mqjms-8.0.0.4.jar:8.0.0.4 - p800-004-151017]

Как можно сократить время ожидания.Есть ли лучший способ для повторной логики?

...