gpt4 book ai didi

c# - 如何为队列管理器别名设置 WebSphereMQ 消息传输头

转载 作者:太空宇宙 更新时间:2023-11-03 23:06:18 25 4
gpt4 key购买 nike

我正在尝试将消息放入未在队列管理器(队列管理器别名)本地定义的远程队列中。我被告知将远程队列管理器名称放在消息传输 header 中,以便将其路由到适当的传输队列。

我可以通过以下方式连接到内部队列管理器:

Hashtable properties = new Hashtable();
properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
properties.Add(MQC.HOST_NAME_PROPERTY, hostName);
properties.Add(MQC.PORT_PROPERTY, port);
properties.Add(MQC.CHANNEL_PROPERTY, channelName);

MQQueueManager queueManager = new MQQueueManager(queueManagerName, properties);

我创建消息并尝试执行 Put,但我不确定在哪里/如何将传输 header 设置为目标队列管理器名称。

message = new MQMessage();
message.Format = MQC.MQFMT_STRING;
message.WriteString(messageString);

queueManager.Put( ???qName???, ???qmName???, message);

我尝试使用空白 qName 并得到一个 [MQRC_REMOTE_Q_NAME_ERROR]

更新:原来他们错误地配置了队列管理器别名。下面的答案帮助我向他们指出了这一点。正如已接受的答案所述,MQ 会为您处理消息传输 header 。正确配置后,它与将消息放入本地定义的远程队列相同。

最佳答案

要回答标题中的问题,您无需设置 XMit header ,因为 MQ 会为您完成此操作。

响应问题的主体,这完全在于MQ如何解析队列名称。在您呈现的情况下,您在打开目标队列时告诉 MQ 将消息发送到哪里。 MQ 然后遵循解析过程来确定将消息放在哪里。

当您指定 QNAME 但未指定 RQMNAME 或当 RQMNAME 是本地队列管理器时,MQ 将查找本地队列。当您指定 QNAME 并且 RQMNAME 不是本地队列管理器时,MQ 会查找通向指定 QMgr 的 XMitQ。如果它找到一个,它会将您的消息放在那里并包含所需的 XMitQ header 。

MQ 通过查看某个 XMitQ 是否与目标 QMgr 同名来找到正确的 XMitQ。如果不是它们,它会查找具有该名称和空白 RNAMEQREMOTE 定义,并使用 XMITQNAME 值。 (因为那种 QREMOTE 指向整个 QMgr,它不能指定 RNAME。这被称为 QMgr 别名,因为它定义了 QMgr 和 QMgr 之间的关系指向它的 XMitQ。)

详细解释见Queue name resolution在信息中心。

请注意,放置消息的 ID 将需要访问传输队列。授予访问权限允许应用程序将消息发送到远程节点上的任何队列,包括 SYSTEM.* 队列。如果这是一个问题,接收 QMgr 有责任将 channel 的 MCAUSER 设置为无权访问管理队列的帐户 ID。在本地队列管理器上,可以授权指向远程队列的 QREMOTE 定义,而不是 XMit 队列,以防止这种广泛的访问。

关于c# - 如何为队列管理器别名设置 WebSphereMQ 消息传输头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41048135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com