【发布时间】:2020-09-21 19:16:04
【问题描述】:
我正在升级一个使用 IBM MQ 将消息发送到本地 Websphere 8.5 服务器的独立 Java 应用程序。现有应用程序为 MQ 代码使用了一堆不同的 jar(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 并查看每次在下一次发送之前关闭它们。
有什么想法吗?
【问题讨论】:
-
您在队列管理器
AMQERR01.LOG中看到了什么错误?如果您检查队列管理器qm.ini文件,您是否找到PasswordProtection=行,如果是,它设置为什么?由于错误指示通道协商失败,您确定发送的前几条消息实际上是在队列中接收的吗?您是否尝试将连接工厂属性USER_AUTHENTICATION_MQCSP设置为true? (或者java系统属性com.ibm.mq.cfg.jmqi.useMQCSPauthentication到Y。 -
从您的错误来看,您似乎有一个队列管理器在此
localhost(5558)'上运行。你能在 CMD 提示符下运行“dspmqver”吗,查找DataPath并在下面查找qmgrs/QmgrName/errors/AMQERR01.LOG和qmgrs/QmgrName/qm.ini。请清理上面不再需要的 cmets,否则版主会将其移至聊天,我无权进行聊天。 -
这是我从 dspmqver 得到的信息: InstName: Installation1 InstDesc: (blank) DataPath: C:\ProgramData\IBM\MQ(ProgramData 文件夹甚至不存在)
-
所以我的
InstPath指向C:\Program Files\IBM\Websphere MQ。那 - 及其子文件夹 - 不包含任何 *.log 并且唯一的 *.ini 是\samp` folders likemqclient.ini`mqs.ini和\Tools\c\Samples\mqat.ini和\Tools\c\Samples\mqccred\mqccred.ini下的示例 -
不确定我理解你的意思。 websphere 应用服务器是在 Eclipse java 工作空间中创建并运行的。