使用 .NET 等待来自 IBM WebSphere MQ 的响应

Awating response from IBM WebSphere MQ using .NET

为了与数据提供者集成,我必须通过 IBM MQ 通道发送和接收请求。我将发送一个请求并从提供者那里收到一个请求。不过在这个过程中,我可能每秒发送数百个请求,并且需要能够 "match" 响应相应的请求线程。

我不想发送请求,然后继续从队列中获取,直到响应到达,因为如果可能有数百个线程正在 ping 队列以检查它们的响应,那可能会产生大量流量,而且我也不想等待一段时间再检查,因为我希望结果是实时的。

有没有一种方法不仅可以订阅队列,还可以订阅特定的响应 ID 或队列中返回的内容?这看起来应该是可行的,但我在他们的文档中找不到它。

你知道你可以做一个 'MQGET with wait' 吗?

(1) 默认 MQGET 将从队列中获取下一条消息或 return RC 2033(无可用消息)。

(2) 如果没有可用消息,程序可以执行 'MQGET with wait',您可以在其中指定 'x' 毫秒在 returning 2033 的 RC 之前等待。注意:如果消息可用,则 MQGET return 消息一可用 - 它不会在 returning.

之前等待整个内部等待
MQMessage msg = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.WaitInterval = 60000;  // wait 60 seconds

try
{
    inQ.Get(msg, gmo);
    System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength));
}
catch (MQException mqex)
{
    System.Console.Out.WriteLine("MQTest62B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
    if (mqex.Reason == MQC.MQRC_NO_MSG_AVAILABLE)
    {
        // no meesage - life is good - loop again
    }
}

考虑使用关联 ID。典型的模式是...

1)应用下请求消息,MQ生成消息ID返回给应用

2) 后端应用程序处理请求消息并生成响应消息。响应消息的关联ID设置为请求消息的消息ID。

3) 应用程序使用 GMO 选项 MQMO_MATCH_CORREL_ID 并指定它想要为其接收消息的相关 ID。它接收放在 #2 中的响应消息。

这样您就可以进行大量并发 requests/responses 并将请求与相关响应相匹配。

显然,您需要后端应用程序将关联 ID 设置为消息 ID 或其他可预测的内容,这样才能正常工作。您的提供商提供什么?

查看请求示例程序:https://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q024350_.htm

它们是用 C 语言为 MQI 而不是 .NET 编写的,但适用相同的原则。