【问题标题】:MQ error code 2058 when connecting to queue manager by name按名称连接到队列管理器时出现 MQ 错误代码 2058
【发布时间】:2017-11-15 04:13:39
【问题描述】:

从我的工作站运行基本连接测试到远程 MQ 服务器时,我遇到了一种奇怪的行为。

我正在使用 amqssslc.exe 从命令提示符进行连接。

如果我只连接一个证书存储,它会毫无问题地连接,并返回一个结果表明它连接到默认队列管理器 FOO:

C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64>amqssslc.exe -k c:\mycerts\cert

Sample AMQSSSLC start
Connecting to the default queue manager
No client connection information specified.
Using SSL key repository stem c:\mycerts\cert
No OCSP configuration specified.
Connection established to queue manager FOO
Sample AMQSSSLC end

但是,如果我尝试连接到队列管理器 FOO,它会返回 2058 错误,这通常表示队列管理器名称错误。

C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64>amqssslc.exe -k c:\mycerts\cert -m FOO

Sample AMQSSSLC start
Connecting to queue manager FOO
No client connection information specified.
Using SSL key repository stem c:\mycerts\cert
No OCSP configuration specified.
MQCONNX ended with reason code 2058

即使我直接从结果中复制名称,它也会这样做。它很快就会失败,并且不会在我的 AMQERR01.LOG 文件中生成日志条目。

此行为是否表明我的 CCDT 文件存在问题?


更新:

根据@JoshMc 的建议,我运行以下命令来获取有关供应商提供的 CCDT 文件的信息:

echo DIS CHL(*) QMNAME CONNAME|runmqsc -n

结果表明文件中没有指定队列管理器:

C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64>echo DIS CHL(*) QMNAME CONNAME|runmqsc -n
5724-H72 (C) Copyright IBM Corp. 1994, 2016.
Starting local MQSC for 'MYQUEUE.TAB'.
 1 : DIS CHL(*) QMNAME CONNAME
AMQ8414: Display Channel details.
   CHANNEL(FOOCHANNEL)                CHLTYPE(CLNTCONN)
   CONNAME(CONNAME(xxx.xxx.xxx.xxx(1414),xxx.xxx.xxx.xxx(1414))
   QMNAME( )

No commands have a syntax error.

【问题讨论】:

    标签: ibm-mq


    【解决方案1】:

    如果您查看位于 C:\Program Files\IBM\MQ\Tools\c\Samples\Bin64\amqssslc.c 的源代码,您会发现它执行以下操作:

    1. 如果没有指定队列管理器名称,它会将队列管理器名称设置为NULL 并打印Connecting to the default queue manager
    2. 如果未指定连接名称,则不会设置ClientConn,并且ConnectOptions.ClientConnPtr 保留其默认NULL 值,它将打印No client connection information specified.
    3. 如果指定了 SSL 密钥存储库主干,它会将SslConnOptions.KeyRepository 设置为此值并打印出Using SSL key repository stem <stem location>,然后将ConnectOptions.SSLConfigPtr 指向SslConnOptions

    在所有这些之后,它会发出一个MQCONNX 并指定NULL 队列管理器名称和ConnectOptions。因为ConnectOptions.ClientConnPtr 保留为默认NULL 值,MQ 将尝试找出如何通过其他几种不同的方式连接到队列管理器。 IBM v7.5(或更高版本)知识中心页面“Connecting IBM WebSphere MQ MQI client applications to queue managers”记录了查找连接信息的顺序和位置。在您的情况下,它正在获取 CCDT 文件。

    当您未指定队列管理器名称时,它会在 CCDT 中查找具有空白 QMNAME 属性的条目,并找到您定义的 CLNTCONN 通道,其中 QMNAME 为空白。 CLNTCONN 通道上的空白 QMNAME 是一种特殊情况,其中 MQ 客户端将连接到任何在您指定的 CONNAME 处侦听的队列管理器名称。因为您正在指定 SSL 密钥存储库,所以它将使用此密钥存储库通过您在 CCDT 中的 CLNTCONN 上指定的 SSLCIPH 连接到 MQ。

    当您执行指定队列管理器名称FOO 时,它会尝试在CCDT 中查找QMNAME 属性设置为FOO 的条目,在您的情况下它不存在所以你会收到2058MQRC_Q_MGR_NAME_ERROR 错误。


    根据您的更新,CCDT 频道确实有一个空白的QMNAME 属性,CONNAME 列出了两个不同的 IP(PORT),由一个公共分隔。使用此配置,MQ 将首先尝试连接到第一个 IP,如果连接超时或由于某些其他原因(例如队列管理器上的通道处于 STOPPED 状态)而结束,它将尝试连接到第二个 IP。

    他们很可能打算让您使用空白或 NULL 队列管理器名称进行连接,因为客户端将连接到正在侦听 CONNAME 的任何队列管理器名称,在您的情况下是第一个 IP(PORT ) 可能是队列管理器 FOO,第二个 IP(PORT) 可能是队列管理器 BAR。


    如果您希望它在您指定 -m FOO 时与您的 CCDT 一起工作,您需要使用 QMNAME(FOO) 创建一个具有 CLNTCONN 频道的新 CCDT,或者将另一个 CLNTCONN 频道添加到您现有的 CCDT 中QMNAME(FOO),请注意,单个 CCDT 中不能有重复的频道名称。


    有关 CCDT 以及要指定的队列管理器名称的更多信息,请参阅我对“Connecting to IBM MQ using CCDT file in JMS”的回答。答案与 JMS 有关,但该信息也适用于 MQI 客户端。


    您还可以像 Roger 所说的那样在命令行上指定所有详细信息。运行amqssslc.exe ? 获取使用信息,它应该如下所示:

    Sample AMQSSSLC start
    Parameters:  [-m QMgr]
      [-c ChlName -x ConnName]
      [-k KeyReposStem] [-s CipherSpec]
      [-p any|rfc5280]
      [-f] [-b none|128_bit|192_bit[,...] ]
      [-o OcspURL]
    

    【讨论】:

    • 感谢您的详尽回答。 CCDT 文件是供应商提供的,所以我需要等待他们的回复才能确认。
    • 我使用的是 v9 版本。我运行您建议的命令的结果返回一个空的 QM 名称。这是否表明供应商没有在他们提供的 CCDT 文件中包含所需的信息? 5724-H72 (C) 版权所有 IBM Corp. 1994, 2016。为“MYQUEUE.TAB”启动本地 MQSC。 1:DIS CHL(*) QMNAME CONNAME AMQ8414:显示通道详细信息。 CHANNEL(FOOCHANNEL) CHLTYPE(CLNTCONN) CONNAME(xxx.xxx.xxx.xxx(1414),xxx.xxx.xxx.xxx(1414)) QMNAME( ) 没有命令有语法错误。
    • 我很抱歉格式化 - 所以不支持 cmets 中的换行符。
    • 是的,问题已解决。我会将您的答案标记为答案,并使用其他信息更新我的问题。感谢您的帮助。
    • @kiprainey,很高兴它有帮助。我基于 CONNAME 包含两个 IP/端口,那么很可能每个 IP/端口组合都是不同的 QMNAME,并且通过为该值指定空白,它允许您连接到任一队列管理器。我将清理您的问题和我的答案中涵盖的一些旧 cmets。
    【解决方案2】:

    我在运行基本连接测试时遇到了奇怪的行为 从我的工作站到远程 MQ 服务器。

    它不是程序。您没有指定足够的参数。您是否发出“amqssslc.exe”?还是看源码?即 amqssslc.c

    频道名称在哪里?连接名称在哪里? CipherSpec 在哪里?等等……

    【讨论】:

    • 可以不带任何参数连接,例如amqssslc.exe。您提到的参数在 CCDT 文件中。
    • 在 JoshMc 向您解释之后,您决定使用 CCDT 做出回应。当然,如果您使用的是 CCDT 文件,那么问题就变成了“为什么不将密钥存储库也放入其中?”。
    • 在 Windows 系统上,密钥存储库通常被称为环境变量。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多