Jms 不使用CLIENTRECONNECTOPTIONS的IBM MQ Connect Factory CLIENTRECONNECTTIMEOUT

Jms 不使用CLIENTRECONNECTOPTIONS的IBM MQ Connect Factory CLIENTRECONNECTTIMEOUT,jms,ibm-mq,spring-jms,Jms,Ibm Mq,Spring Jms,我使用的MQQueueConnectionFactory没有CLIENTRECONNECTTIMEOUT和CLIENTRECONNECTOPTIONS。使用SpringJMSTemplate发送消息 <bean id="mqCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnecti

我使用的MQQueueConnectionFactory没有CLIENTRECONNECTTIMEOUT和CLIENTRECONNECTOPTIONS。使用SpringJMSTemplate发送消息

<bean id="mqCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="mqConnectionFactory" />
    <property name="sessionCacheSize" value="20" /> 
    <property name="reconnectOnException" value="true"/>
我让spring CachingConnectionFactory检测错误并尝试重新连接

当队列管理器意外停机时,问题就会出现。Spring CachingConnectionFactory检测到此情况并开始新连接。现在IBM MQ连接工厂尝试创建一个新连接。它等待30分钟,然后放弃MQRC_主机_不可用。 堆栈跟踪:

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}

当CLIENTRECONNECTOPTIONS未设置且默认情况下被禁用时,此选项是否会生效?

根据问题的描述,java在初始连接时似乎需要30分钟才能超时

MQ有一个参数,允许您调整TCP连接超时

从我可以看出,如果不设置参数,它取决于java实现和底层操作系统设置,取决于超时所需的时间,在您的情况下,这必须是30分钟,但这似乎非常高,例如在Linux上,我相信默认值是93秒

有两种方法可以实现这一点:

  • 通过将java系统属性
    com.ibm.mq.cfg.TCP.Connect\u Timeout
    设置为连接超时所需的秒数。这可以通过两种方式实现:
    • 以编程方式使用
      System.setProperty('com.ibm.mq.cfg.TCP.Connect\u Timeout','5')
    • 在命令行上传递
      -Dcom.ibm.mq.cfg.TCP.Connect\u Timeout=5
  • 您还可以将
    Connect\u Timeout=5
    放在
    mqclient.ini
    文件的
    TCP:
    节中,IBM MQ JMS类将从各个默认位置获取该值。查看我对“”的回答,了解MQ将在何处查找此文件的信息。注意:答案是在考虑Windows操作系统的情况下编写的,但是指向IBM知识中心文档的链接也将向您显示Unix/Linux路径

    TCP:
       Connect_Timeout=5
    

  • 30分钟后不会尝试重新连接。30分钟后,它将放弃连接到mq主机。我想控制它在放弃之前等待的时间。是的。连接超时错误需要30分钟。用户可以在浏览器中看到请求旋转。尝试在5秒钟内超时。我们尝试执行的MQ操作是可选的。不幸的是,我不能命令拆除qmgr。只有在极端情况下才会发生这种情况。一旦qmgr启动,SpringJMS就会恢复。但当它关闭时,尽量减少对用户的影响。他们将看到慢5秒,但至少不会被阻止。更新了带有超时堆栈跟踪的问题,显示了等待的位置。需要知道此跟踪中是否有任何类使用超时配置。如果将配置指向网络上未分配给任何服务器的IP,是否会得到相同的结果?我可以使用随机IP地址重现相同的错误。能够使用System.setProperty('com.ibm.mq.cfg.TCP.Connect\u timeout','5')控制超时。谢谢你。@Aladin我认为你没有线程安全的选项。如果你想让原始海报以外的任何人注意到你,你需要像我为你做的那样给他们贴上@标签。
    firstMQConnectionFactory.setClientReconnectTimeout(5);
    
    TCP:
       Connect_Timeout=5