【问题标题】:How To Set WebSphereMQ Message Transmission Header for Queue Manager Alias如何为队列管理器别名设置 WebSphereMQ 消息传输头
【发布时间】:2016-12-13 03:13:47
【问题描述】:

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

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

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]

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

【问题讨论】:

    标签: c# ibm-mq


    【解决方案1】:

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

    回答问题的主体,就是 MQ 如何解析队列名称。在您介绍的情况下,您在打开目标队列时告诉 MQ 将消息发送到哪里。然后 MQ 遵循一个解析过程来确定将消息放在哪里。

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

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

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

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

    【讨论】:

    • 谢谢。我目前无法发送消息,但您的解释澄清了一些事情。问题实际上可能是如何设置队列。到目前为止,我发现他们的传输队列不正确,可能还有其他问题。我将使用 qName、qmName 等更新我的问题,一旦我们开始工作。
    • 原来是配置问题...更新了详细问题
    • 感谢您跟进 cmets 和更新。这些使网站变得更好!
    猜你喜欢
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2013-11-05
    • 2013-07-16
    • 1970-01-01
    • 2016-11-18
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多