我试图将消息放在远程队列上,该队列未在队列管理器(队列管理器别名)上本地定义。我被告知要将远程队列管理器名称放在消息传输头中,以便将其路由到相应的传输队列。
我能够使用以下内容连接到内部队列管理器:
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为您处理消息传输标头。正确配置后,它就像在本地定义的远程队列上放置消息一样。
答案 0 :(得分:3)
要回答标题中的问题,您不需要设置XMit标头,因为MQ会为您执行此操作。
回答问题的主体,全部是MQ如何解析队列名称。在您出现的情况下,您将告诉MQ在打开目标队列时将消息发送到何处。然后,MQ遵循解决过程来确定将消息放在何处。
当您指定QNAME
但没有RQMNAME
或RQMNAME
是本地队列管理器时,MQ会查找本地队列。当您指定QNAME
且RQMNAME
不本地队列管理器时,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队列,以防止这种广泛访问。