【问题标题】:Getting MQ error (reason 2594) when trying to connect to MQ manager after first few messages在前几条消息后尝试连接到 MQ 管理器时出现 MQ 错误(原因 2594)
【发布时间】: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.useMQCSPauthenticationY
  • 从您的错误来看,您似乎有一个队列管理器在此 localhost(5558)' 上运行。你能在 CMD 提示符下运行“dspmqver”吗,查找DataPath 并在下面查找qmgrs/QmgrName/errors/AMQERR01.LOGqmgrs/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 like mqclient.ini` mqs.ini\Tools\c\Samples\mqat.ini\Tools\c\Samples\mqccred\mqccred.ini 下的示例
  • 不确定我理解你的意思。 websphere 应用服务器是在 Eclipse java 工作空间中创建并运行的。

标签: java websphere mq


【解决方案1】:

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

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

我不确定为什么在这种特殊情况下似乎有效。发生的失败发生在 MQQueueManager 声明上,该声明在代码中比 replyToQueueName 设置器要高得多。这与仅在发送 4-5 条消息后发生的错误相结合,似乎可能表明某些东西没有被正确“关闭”,但据我所知,没有办法“关闭”消息,我们已经在关闭/断开连接经理和队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2020-04-23
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2012-10-06
    • 2013-04-06
    相关资源
    最近更新 更多