IBM MQ 使用 amqsgetc 失败,原因为“2058”

IBM MQ fail with reason '2058' with amqsgetc

当运行GET样本amqsget我在队列中可以正常连接...

C:\Program Files\IBM\MQ\bin>amqsget QUEUE1
Sample AMQSGET0 start
no more messages
Sample AMQSGET0 end

但是当使用 amqsgetc 时我得到一个错误 "MQCONNX ended with reason code 2058":

C:\Program Files\IBM\MQ\bin>amqsgetc QUEUE1
Sample AMQSGET0 start
MQCONNX ended with reason code 2058

在末尾显式添加队列管理器也不起作用。

article from IBM summarizes the problem causes but it still not clear why one is working and not the other. This other article 解释了示例程序。

以 'c' 结尾的示例程序 link 使用 MQ 客户端库,而不是服务器库。因此,它们通过网络连接(通常是 TCP)而不是共享内存进行连接。

您 link 阅读的文章提供了有关在确定如何访问远程队列管理器时使用的优​​先顺序的更多信息,但总而言之,客户端很可能不知道如何访问联系队列管理器。

您需要将用于联系队列管理器的连接详细信息告知客户端,或者使用 CCDT, or using the MQSERVER environment variable

amqsget 将使用共享内存管道连接到本地计算机上的队列管理器。这意味着只要它与您的队列管理器在同一台机器上,它就可以找到队列管理器并连接到它。

amqsgetc 将通过网络连接到队列管理器。因为,默认情况下,它不知道队列管理器在哪里,您需要告诉它如何连接到队列管理器。您可以通过以下 3 种方式之一告诉 amqsgetc(或任何客户端应用程序)如何连接队列管理器:

  1. 以编程方式。如果您有自定义应用程序,您可以在连接详细信息中进行编程以对它们进行硬编码。 这不是 amqsgetc 的选项。
  2. MQSERVER 环境变量。如果您设置此环境变量,那么您 amqsgetc 将获取它需要的详细信息。变量的格式应为:<Channel>/<Network Protocol, most likely TCP>/<address>(<port>) 例如 Channel1/TCP/localhost(1414)This page 有更多关于 MQSERVER 的详细信息。
  3. 一个 CCDT 文件。如果您创建一个 CCDT 文件,那么您 amqsgetc 可以选择它以找到您需要的连接详细信息。有关 CCDT 文件的更多信息 here