【问题标题】:Awating response from IBM WebSphere MQ using .NET使用 .NET 等待来自 IBM WebSphere MQ 的响应
【发布时间】:2017-08-01 14:45:53
【问题描述】:

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

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

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

【问题讨论】:

  • 看xms和回调。

标签: c# ibm-mq


【解决方案1】:

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

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

(2) 如果没有消息可用,程序可以执行“MQGET with wait”,您可以指定“x”毫秒等待,然后返回 2033 的 RC。注意:如果消息可用,则 MQGET 会在消息可用时立即返回 - 它不会在返回之前等待整个内部等待。

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
    }
}

【讨论】:

    【解决方案2】:

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

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

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

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

    通过这种方式,您可以处理大量并发请求/响应,并将请求与相关响应相匹配。

    很明显,您需要后端应用程序将相关 ID 设置为消息 ID 或其他可预测的东西才能正常工作。您的提供商提供什么?

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多