在前几条消息后尝试连接到MQ管理器时出现MQ错误原因2594

问题描述

我正在升级一个独立的Java应用程序,该应用程序使用IBM MQ将消息发送到本地Websphere 8.5服务器。现有的应用程序使用一堆不同的jar作为MQ代码(mq,mqbind mqjms,connector-api,jms)。

对于新版本,我看到现在有了一个包罗万象的“ allclient” MQ JAR(https://mvnrepository.com/artifact/com.ibm.mq/com.ibm.mq.allclient/9.2.0.0),所以我决定使用它。

对于前几条消息似乎工作正常,但是在发送4-5条消息后,所有后续消息将失败,并显示代码2594(https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.tro.doc/q120510_.htm):

Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2594;AMQ9204: Connection to host 'localhost(5558)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2594;AMQ9503: Channel negotiation Failed. [3=WAS.JMS.SVRCONN     ]],3=localhost(5558),5=RemoteConnection.initSess]
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13588)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.access$100(RemoteFAP.java:13125)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1430)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1389)
    at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377)
    at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562)
    at com.ibm.mq.MQSESSION.MQCONNX_j(MQSESSION.java:916)
    at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:240)

在服务器端,控制台中显示以下内容

CWSIC3712E: A WebSphere MQ client,prevIoUsly connected from host 127.0.0.1:58963 on transport chain InboundBasicMQLink,has been disconnected because of exception java.io.IOException: Async IO operation Failed (1),reason: RC: 55  The specified network resource or device is no longer available.

发生此错误后,以后发送消息的任何尝试都将失败,并显示相同的错误。我必须重新启动应用程序,然后重复相同的操作:在失败开始之前先发送4-5条消息。如果我在不更改代码的情况下切换回使用旧的JAR,则可以发送无限数量的消息而没有任何问题。

原因代码使我感到困惑(“从客户端连接的应用程序发出了MQCONN或MQCONNX调用,但未能与队列管理器达成密码保护算法。”),因为这确实是密码问题,为什么?前几条消息发送没有问题?关闭/断开队列/管理器似乎不是问题,因为我将在每次发送之间等待几秒钟,并且可以断点/ println并在每次下一次发送之前先查看它们是否被关闭

有什么想法吗?

解决方法

我找到了解决此问题的部分方法:

在Java代码中,对于我们的MQMessage对象,我们声明一个“ replyToQueueName”。如果删除该设置器,问题似乎就消失了(我们可以发送任意数量的消息而不会出现错误)。

我不确定为什么在这种特殊情况下似乎可行。发生的故障发生在MQQueueManager声明中,该声明在代码中比replyToQueueName设置器高得多。结合此错误,此错误仅在发送4-5条消息后出现,似乎表明未正确“关闭”某事,但据我所知没有办法“关闭”一条消息,而我们已经在关闭/断开连接管理器和队列。