IBM MQ v8 - 已发布消息的实时消费

IBM MQ v8 - real time consumption of a published message

在沙盒环境中,我正在测试 IBM MQ。我已经有使用 RabbitMq 的经验。

使用 IBM MQ,我无法直接使用队列中的消息。 RabbitMQ(Consume() 方法)就是这种情况。但是对于 IBM MQ,我必须使用以下代码显式地查看队列:

var queue = _queueManager.AccessQueue("queueName", MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);

这就是我现在所知道的有关从队列中读取消息的信息。但是,如果有一种方法可以直接消费消息(事件明智,或者换句话说:实时消费。队列中的项目将成为开始阅读它的触发器。)而不调用上面的代码,有没有人可以帮助我?

如果您想在消息到达队列时被触发,您可以配置一个进程,并根据队列中的触发消息将该进程设置为最多 运行。

或者,您可以查看 MQGMO_WAIT,您可以使用与上面几乎完全相同的代码在侦听队列中的消息时保持线程阻塞。

编辑:因此,您可以将代码设置为在消息到达触发器队列时(每次)或消息第一次到达触发器队列时(首先)被调用,并且您的 MQ 进程将是类似于“/path/to/myprog.exe”。传入的参数将采用 MQTriggerMessage 的格式,包括队列名称和一些其他详细信息。假设您在每条消息上都设置了触发器,这将允许任意数量的处理任务。

或者,您可以将队列作为共享打开,多个任务可以等待一条消息到达队列。使用 MQOpenOption.INPUT_SHARED 标志。

您可以考虑使用 XMS .NET 客户端的消息侦听器在消息到达队列时使用它们。您需要在项目中引用 IBM.XMS 程序集。你可以看看异步消费者示例Tools\dotnet\samples\cs\xms\simple\wmq\SimpleAsyncConsumer\SimpleAsyncConsumer.cs.

But with IBM MQ I have to explicitly look in the queue with following code:

var queue = _queueManager.AccessQueue("queueName", ...

您需要多读一点,因为AccessQueue 只打开队列。您需要使用 Queue 的 Get 方法来检索消息。

如果您想永远这样做(直到队列管理器关闭),那么您可以这样做:

private void loopForever(MQQueue inQ)
{
   bool flag = true;
   MQMessage msg = new MQMessage();
   MQGetMessageOptions gmo = new MQGetMessageOptions();
   gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING;
   gmo.WaitInterval = MQC.MQEI_UNLIMITED;

   while (flag)
   {
      try
      {
         msg = new MQMessage();
         inQ.Get(msg, gmo);
         System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength));
      }
      catch (MQException mqex)
      {
         System.Console.Out.WriteLine("MQTest61B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
         flag = false;  // severe error - time to exit
      }
      catch (System.IO.IOException ioex)
      {
          System.Console.Out.WriteLine("MQTest61B ioex=" + ioex);
      }
   }
}