如何为 Queue 管理器别名设置 WebSphereMQ 消息传输 Header

How To Set WebSphereMQ Message Transmission Header for Queue Manager Alias

我正在尝试将消息发送到远程 queue 上,该消息未在 queue 管理器(queue 管理器别名)上本地定义。我被告知将远程 queue 管理器名称放在消息传输 header 中,这样它将被路由到适当的传输 queue.

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

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,但我不确定where/how 将传输设置为 header 到目的地 queue 管理器名称。

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

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

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

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

上放置消息一样

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

回答问题的body,全在于MQ如何解析queue名字。在您呈现的情况下,您在打开目标时告诉 MQ 将消息发送到哪里 queue。 MQ 然后遵循解析过程来确定将消息放在哪里。

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

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

详细说明请查看信息中心Queue name resolution

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