【问题标题】:WebSphere MQ MessageListener (Similar to JMS Message Listener)WebSphere MQ 消息侦听器(类似于 JMS 消息侦听器)
【发布时间】:2012-06-29 03:43:13
【问题描述】:

我有 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 函数。

有什么办法吗?

【问题讨论】:

    标签: java ibm-mq websphere-7


    【解决方案1】:

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

    您可以使用

    排除它

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 那么,你的意思是除了while循环之外别无选择?为了减少 while 循环的数量,我使用了 MQConstants.MQGMO_WAIT;并将 waitInterval 设置为半分钟(60,000)。但是,“MQJE001:完成代码‘2’,原因‘2033’。”如果队列在 waitInterval 结束前没有任何消息,则显示。那么,我怎样才能避免这种异常呢?我编辑了我的新代码。非常感谢您的帮助。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以使用 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;
          }
        
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2011-01-20
          • 2010-12-04
          • 2010-12-04
          • 2012-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-09
          相关资源
          最近更新 更多