0

我有从队列中检索消息的 MQConsumerClass,如下所示。

while (running)
{
    try
    {
        MQMessage rcvMessage = new MQMessage();
        MQGetMessageOptions gmo = new MQGetMessageOptions();

        gmo.options = MQConstants.MQGMO_WAIT;
        gmo.waitInterval = 60000; 
        queue.get(rcvMessage, gmo);

        if(rcvMessage.getTotalMessageLength() > 0)
        {
            String msgText = rcvMessage.readUTF();
        }
    }
    catch blocks{}
}

但问题是当队列中没有消息时,会抛出 2033 异常。

我认为 2033 NO_MSG_AVAILABLE 异常不是可能会停止操作的严重异常。

onMessage(Message msg)但是,每当队列中有新消息时,我想调用函数。

我想用 MessageListener 创建这个类,但我找不到 MessageListener 或任何与之相关的示例。

所以,请告诉我 WMQ Java API 中是否有任何 MessageListener 函数。

或者

有什么办法吗?

4

4 回答 4

5

2033“错误”实际上不是错误,它更像是 MQSeries 返回状态: MQRC_NO_MSG_AVAILABLE 2033 MQTester 程序正在轮询队列以查找消息,但没有可用的消息。

你可以排除它

MQException.logExclude(新整数(MQException.MQRC_NO_MSG_AVAILABLE));

于 2012-11-09T14:27:48.033 回答
1

好吧,WMQ Java API 没有消息监听器。没有类似onMessage的JMS,只有同步接收。

于 2012-06-29T07:00:32.137 回答
1

在这种循环中,您无法完全避免这些 2033“无消息”异常。通过增加等待间隔,几乎没有缺点(除了完成后应用程序关闭速度可能会变慢),并且您将减少每次获取调用都无法获取消息的机会。因此,例如,如果您指定 5 分钟的等待间隔,只要每 5 分钟至少有一条消息到达队列,那么每个 get 调用都会收到一条消息(通常)。但是对于这种异常,您仍然需要一个 catch 块,因为您应该期望有时在您的等待间隔内找不到消息。只要您的等待间隔不是太短,那么失败的获取、捕获块和循环循环的性能开销应该相对较小。

如果您真的想使用异步使用者,当消息可用时将调用您的应用程序,那么用于 JMS 的 WebSphere MQ 类就是 Java API,您可以在其中找到 MessageListener 接口。WebSphere MQ 为 Java 公开了 2 个不同的 API。您的代码片段正在使用用于 Java 的 WebSphere MQ 类,而不是 JMS。

于 2012-06-29T14:05:26.453 回答
1

您可以使用 MQConstants.MQWI_UNLIMITED来指定无限等待间隔。

while (running) {
      MQGetMessageOptions gmo = new MQGetMessageOptions();
      gmo.options = MQConstants.MQGMO_WAIT; 
      gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

  try {
      // Get the message off the queue.
      queue.get(rcvMessage, gmo);
  } catch (MQException e) {
    if (e.reasonCode == 2033) {
        continue;
  }

}

}

于 2013-09-02T16:19:47.790 回答