【问题标题】: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 但没有指定RQMNAMERQMNAME 是本地队列管理器时,MQ 会查找本地队列。当您指定QNAME 并且RQMNAME 不是本地队列管理器时,MQ 会查找通向指定QMgr 的XMitQ。如果它找到一个,它会将您的消息放在那里并包含所需的 XMitQ 标头。

    MQ 通过查看是否与目标 QMgr 同名来找到正确的 XMitQ。如果不是它们,它会查找具有该名称和空白RNAMEQREMOTE 定义,并使用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
    相关资源
    最近更新 更多