我试图在远程队列上放置一条消息,而远程队列不是在队列管理器(队列管理器别名)上本地定义的。我被告知要将远程队列管理器名称放在消息传输头中,以便将其路由到适当的传输队列。
我能够用以下方法连接到内部队列管理器:
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为您处理消息传输头。一旦配置正确,就等于将消息放在本地定义的远程队列上。
发布于 2016-12-08 20:38:01
要回答标题中的问题,您不需要设置XMit头,因为MQ将为您做这件事。
针对问题的主体,这都取决于MQ如何解析队列名。在出现的情况下,当打开目标队列时,可以告诉MQ在哪里发送消息。然后MQ遵循一个解析过程来确定将消息放在哪里。
当您指定QNAME但没有指定RQMNAME或当RQMNAME是本地队列管理器时,MQ将查找本地队列。当您指定QNAME并且RQMNAME不是本地队列管理器时,MQ会查找一个导致命名QMgr的XMitQ。如果它找到一个,它会将您的消息放在那里,并包含所需的XMitQ头。
MQ通过查看是否与目标XMitQ具有相同的名称来找到正确的QMgr。如果不是,它将查找具有该名称和空白RNAME的RNAME定义,并使用XMITQNAME值。(因为这种QREMOTE指向整个QMgr,所以不能指定RNAME。这被称为QMgr别名,因为它定义了指向它的QMgr和XMitQ之间的关系。)
有关详细说明,请参阅Infocenter中的队列名称解析。
请注意,输入消息的ID将要求访问传输队列。授予访问权限允许应用程序向远程节点上的任何队列(包括SYSTEM.*队列)发送消息。接收QMgr的责任是将通道的MCAUSER设置为一个帐户ID,如果这是一个问题,该帐户ID不能访问管理队列。在本地队列管理器上,可以授权指向远程队列的QREMOTE定义,而不是XMit队列,以防止如此广泛的访问。
https://stackoverflow.com/questions/41048135
复制相似问题