IBM MQ Connect Factory CLIENTRECONNECTTIMEOUT без использования CLIENTRECONNECTOPTIONS

Я использовал MQQueueConnectionFactory без CLIENTRECONNECTTIMEOUT и CLIENTRECONNECTOPTIONS. Использование Spring JmsTemplate для отправки сообщения.

<bean id="mqCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="mqConnectionFactory" />
    <property name="sessionCacheSize" value="20" /> 
    <property name="reconnectOnException" value="true"/>

Not using any of the following IBM MQ connection factory settings.

firstMQConnectionFactory.setClientReconnectOptions(WMQConstancs.WMQ_CLIENT_RECONNECT;
firstMQConnectionFactory.setClientReconnectTimeout(5);

Я позволяю Spring CachingConnectionFactory обнаруживать ошибки и пытаться переподключиться.

Проблема возникает, когда администратор очередей неожиданно выходит из строя. Spring CachingConnectionFactory обнаруживает это и устанавливает новое соединение. Теперь фабрика соединений IBM MQ пытается создать новое соединение. Он ждет 30 минут, прежде чем сдаться с MQRC_HOST_NOT_AVAILABLE. Трассировки стека:

org.springframework.jms.IllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QMGRID' with connection mode 'Client' and host name 'QMGRHOST(port)'.; nested exception is com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QMGR' with connection mode 'Client' and host name 'hostname(62306)'.\nCheck the queue manager is started and if running in client mode, check there is a listener running. Please see the linked exception for more information.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2538' ('MQRC_HOST_NOT_AVAILABLE').
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9213: A communications error for 'TCP' occurred. [1=java.net.ConnectException[Connection timed out (Connection timed out)],3=connnectUsingLocalAddress,4=TCP,5=Socket.connect]
java.net.ConnectException: Connection timed out (Connection timed out)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:1.8.0_172]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_172]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_172]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_172]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_172]
at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_172]
at java.net.Socket.connect(Socket.java:538) ~[?:1.8.0_172]
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$5.run(RemoteTCPConnection.java:825) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$5.run(RemoteTCPConnection.java:816) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_172]
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.connnectUsingLocalAddress(RemoteTCPConnection.java:816) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1279) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:1003) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:409) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:305) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:155) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1716) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1280) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562) ~[com.ibm.mq.jmqi-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.msg.client.wmq.internal.WMQConnection.< init>(WMQConnection.java:356) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8474) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7814) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:299) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:236) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6016) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:111) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:187) ~[com.ibm.mqjms-9.0.0.3.jar:9.0.0.3 - p900-003-180226]
at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:403) ~[spring-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:343) ~[spring-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:321) ~[spring-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:236) ~[spring-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196) ~[spring-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494) ~[spring-jms-5.0.6.RELEASE.jar:5.0.6.RELEASE]
... 67 more\n}

Можем ли мы просто установить следующий параметр, чтобы ограничить это время ожидания соединения?

firstMQConnectionFactory.setClientReconnectTimeout(5);

Будет ли этот параметр действовать, если параметр CLIENTRECONNECTOPTIONS не установлен и отключен по умолчанию?


person CoderPraBhu    schedule 25.07.2018    source источник
comment
Он не пытается повторно подключиться через 30 минут. Он отказывается от подключения к хосту mq через 30 минут. Я хочу контролировать время ожидания, прежде чем отказаться от него.   -  person CoderPraBhu    schedule 26.07.2018
comment
Да. Ошибка тайм-аута подключения занимает 30 минут. Пользователи видят, как запрос крутится в браузере. Пытаюсь уложиться в 5 секунд. Операция MQ, которую мы пытаемся сделать, не является обязательной. К сожалению, я не могу приказать удалить qmgr. Бывает только в крайних случаях. Spring JMS восстановится, как только qmgr будет запущен. Но пока он не работает, мы пытаемся свести к минимуму влияние на пользователя. Они увидят замедление на 5 секунд, но, по крайней мере, не будут заблокированы. Обновлен вопрос с трассировкой стека для тайм-аута, который показывает, где он ждал. Нужно знать, использует ли какой-либо класс в этой трассировке конфигурацию тайм-аута.   -  person CoderPraBhu    schedule 26.07.2018
comment
Вы получите тот же результат, если укажете свою конфигурацию на IP-адрес в вашей сети, который не назначен ни одному серверу?   -  person JoshMc    schedule 26.07.2018
comment
Я смог воспроизвести ту же ошибку, используя случайный IP-адрес. Удалось контролировать время ожидания с помощью System.setProperty('com.ibm.mq.cfg.TCP.Connect_Timeout', '5'). Спасибо.   -  person CoderPraBhu    schedule 27.07.2018
comment
Рад, что это сработало для вас. Я добавил ответ с этими деталями. Пожалуйста, примите его, поставив галочку слева от ответа. Спасибо.   -  person JoshMc    schedule 27.07.2018
comment
Я знаю, что это старый пост, но у меня такая же проблема. Странно, что решение состоит в изменении глобального свойства. Что делать, если я хочу, чтобы некоторые соединения имели 30 минут, а другие - 5 секунд?   -  person Aladin    schedule 23.04.2020
comment
@Aladin Я не думаю, что у вас есть такая возможность в потокобезопасной манере. Если вы хотите, чтобы SO предупредил кого-либо, кроме оригинального постера, вам нужно пометить их @, как я сделал для вас.   -  person JoshMc    schedule 21.09.2020


Ответы (1)


Основываясь на описании проблемы, кажется, что java занимает 30 минут до тайм-аута при первоначальном соединении.

В MQ есть параметр, позволяющий настроить тайм-аут соединения TCP.

Из того, что я могу сказать, если вы не установите параметр, это зависит от реализации Java и базовых настроек ОС от того, сколько времени потребуется для тайм-аута, в вашем случае это должно быть 30 минут, но это кажется очень высоким в Linux например, я считаю, что значение по умолчанию составляет 93 секунды.

Есть два способа сделать это:

  1. By setting the java system property com.ibm.mq.cfg.TCP.Connect_Timeout to the number of seconds you want for the connection to timeout. This can be done in two ways:
    • Programmatically using System.setProperty('com.ibm.mq.cfg.TCP.Connect_Timeout', '5')
    • В командной строке, передав -Dcom.ibm.mq.cfg.TCP.Connect_Timeout=5
  2. Вы также можете поместить Connect_Timeout=5 в раздел TCP: файла mqclient.ini, и классы IBM MQ для JMS подберут его из различных расположений по умолчанию. Посмотрите на мой ответ на вопрос "Где должен быть MQClient. ini для приложения IIS?" для получения информации о том, где MQ будет искать этот файл. Обратите внимание, что ответ был написан с учетом ОС Windows, но ссылка на документацию IBM Knowledge Center также покажет вам пути Unix/Linux.

    TCP:
       Connect_Timeout=5
    
person JoshMc    schedule 27.07.2018