WebSphere MQ MessageListener(类似于JMS消息侦听器)

时间:2012-06-29 03:43:14

标签: java ibm-mq websphere-7

我有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 个答案:

答案 0 :(得分:5)

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

您可以使用

将其排除
  

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

答案 1 :(得分:1)

嗯,WMQ Java API没有消息监听器。类似于onMessage的JMS不存在,只有同步接收。

答案 2 :(得分:1)

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

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

答案 3 :(得分: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;
  }

}

}