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

时间:2016-12-08 20:20:20

标签: c# ibm-mq

我试图将消息放在远程队列上,该队列未在队列管理器(队列管理器别名)上本地定义。我被告知要将远程队列管理器名称放在消息传输头中,以便将其路由到相应的传输队列。

我能够使用以下内容连接到内部队列管理器:

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,但我不知道将传输头设置到目标队列管理器名称的位置/方式。

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

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

我尝试使用空白qName并获取[MQRC_REMOTE_Q_NAME_ERROR]

UPDATE :原来他们错误地配置了队列管理器别名。下面的答案帮助我指出了它们。正如接受的答案所述,MQ为您处理消息传输标头。正确配置后,它就像在本地定义的远程队列上放置消息一样。

1 个答案:

答案 0 :(得分:3)

要回答标题中的问题,您不需要设置XMit标头,因为MQ会为您执行此操作。

回答问题的主体,全部是MQ如何解析队列名称。在您出现的情况下,您将告诉MQ在打开目标队列时将消息发送到何处。然后,MQ遵循解决过程来确定将消息放在何处。

当您指定QNAME但没有RQMNAMERQMNAME是本地队列管理器时,MQ会查找本地队列。当您指定QNAMERQMNAME 本地队列管理器时,MQ会查找指向QMgr的XMitQ。如果它找到一个,它会将您的消息放在那里,并包含所需的XMitQ标题。

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

有关详细说明,请参阅信息中心的Queue name resolution

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