连接到队列管理器 JMS 时出现 MQ 错误代码 2058

MQ error code 2058 when connecting to queue manager JMS

我正在尝试使用 MQ 连接到队列管理器 api 并且我能够连接到队列管理器

MQQueueManager queueManager=new MQQueueManager(qmgrName);
queueManager.accessQueue(qName,MQOO_OUTPUT);

但是当我尝试使用 JMS 连接到同一个队列管理器时,它失败并显示 2058 code.Not 确定我是否遗漏了 JMS 的某些内容

    MQQueueConnectionFactory qcf=new MQQueueConnectionFactory();
    qcf.setQueueManager(qmgrName);
    qcf.setPort(1414);
    qcf.setHostname("localhost");
    qcf.createQueueConnection();

如文档所述here,MQRC 2058 表示队列管理器名称无效或队列管理器名称未知。但是正如您提到的,使用 MQ Base Java 的绑定模式连接是成功的,队列管理器名称似乎有效。

更新:

抱歉,我被您的代码误导了,我以为您正在尝试使用 JMS 进行客户端模式连接。您不需要为绑定模式连接设置主机和端口。

由于未设置传输类型,默认使用WMQ_CM_BINDINGS。建议您验证队列管理器名称。

要连接 "BINDINGS",队列管理器需要是本地的。您是否正在尝试连接到远程队列管理器?如果是这样,您需要连接为 "CLIENT"。此外,检查以确保 qmgr 正在侦听您指定的端口。

您在本地主机上有两个或更多队列管理器。在您的第一个示例中,您以绑定模式连接,因此队列管理器是按名称选择的,您会得到正确的。在第二个示例中,连接是通过客户端连接建立的,因此由监听 1414 的 QMgr 接收,这不是您想要的连接,因此连接被拒绝。

请注意,如果两个 QMgr 在 1414 上都有侦听器,则连接成功或失败取决于首先启动的 QMgr。只有一个可以绑定到该端口,因此第一个启动它的人可以使用它。这可能会导致看似不一致的行为。

请参阅 Connection modes for IBM MQ classes for JMS 建议 "To change the connection options used by the IBM MQ classes for JMS, modify the Connection Factory property CONNOPT." 页面上提供了可接受的值,但您几乎总是希望将其设置为标准绑定 (MQCNO_STANDARD_BINDING)。