按名称连接到队列管理器时的MQ错误代码2058

时间:2017-11-08 22:21:22

标签: ibm-mq

从工作站到远程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.

2 个答案:

答案 0 :(得分: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
  4. 完成所有这些后,它会发出MQCONNX并指定NULL队列管理器名称和ConnectOptions。因为ConnectOptions.ClientConnPtr保留在默认的NULL值,MQ将尝试通过几种不同的方式找出如何连接到队列管理器。 IBM V7.5(或更高版本)知识中心页面&#34; Connecting IBM WebSphere MQ MQI client applications to queue managers&#34;中记录了查找连接信息的顺序和位置。在你的情况下,它正在拿起CCDT文件。

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

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

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

    由于客户端将连接到正在侦听CONNAME的任何队列管理器名称的好处,他们打算让您连接空白或NULL队列管理器名称,在这种情况下是第一个IP(PORT) )可能是队列管理器FOO,第二个IP(PORT)可能是队列管理器BAR。

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

    有关CCDT的更多信息以及要指定的队列管理器名称,请参阅我对#34; Connecting to IBM MQ using CCDT file in JMS&#34;的回答。答案与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]
    

答案 1 :(得分:0)

  

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

它不是该计划。您没有指定足够的参数。你发出了&#34; amqssslc.exe吗?&#34;还是看看来源?即amqssslc.c

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

相关问题