【问题标题】:C# MQ Api How to fetch message without getting exception in case of empty queueC#MQ Api如何在空队列的情况下获取消息而不会出现异常
【发布时间】:2012-11-13 20:49:58
【问题描述】:

我必须定期检查 Websphere MQ 中队列中的消息。我没有找到更好的方法,而不是尝试像这样获取消息并处理 2033 原因代码(即 NO_MSG_AVAILABLE):

try
{
    // ...
    inQueue.Get(message);
}
catch (MQException exception)
{
    if (exception.ReasonCode != 2033)
        throw;
}

有没有更好的方法从队列中获取消息?我认为可能有一些我不知道的 openOptions 标志,当没有可用消息时不会抛出异常,而是返回 null。

【问题讨论】:

    标签: c# ibm-mq


    【解决方案1】:

    有三种方法可以避免或减少这种轮询机制。 在这里它们是优雅的(越高越好):

    1. 具有等待间隔 UNLIMITED 和 MQGMO_FAIL_IF_QUIESCING 的 MQGET
    2. 让您的应用程序由 MQServer 触发
    3. 回调函数 - 两边都有 MQ V7 的新功能

    【讨论】:

    • 我不太清楚如何正确设置最优雅的解决方案。我已经设置了这样的队列打开标志:MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING,并获得了这样的消息选项:var getOptions = new MQGetMessageOptions { WaitInterval = MQC.MQWI_UNLIMITED, Options = MQC.MQGMO_FAIL_IF_QUIESCING },但它仍然使用 NO_MSG_AVAILABLE 立即执行。我错过了什么吗?
    【解决方案2】:

    您缺少MQGetMessageOptions.Options 上的MQC.MQGMO_WAIT 标志。改成这样:

    getOptions = new MQGetMessageOptions {WaitInterval = MQC.MQWI_UNLIMITED, Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING}
    

    请注意,这将使调用线程被阻塞,直到消息到达队列或发生某些连接异常。 MQ 有另一个称为 IBM 消息服务客户端(又名 XMS .NET)的客户端,它在 .NET 中提供 JMS 规范实现。这有一个不错的小Message Listener,只要消息到达队列,就会自动调用它。与上例不同的是,在使用 Message Listener 时,调用线程不会被阻塞。

    可以在here 找到有关 XMS .NET 的更多详细信息。示例也随 MQ 一起提供,对于消息侦听器示例,请参阅“SampleAsyncConsumer.cs”源文件。

    【讨论】:

      【解决方案3】:

      我得到了这个。我通过将消息启动器放入循环中来解决它:

      _queueManager = new MQQueueManager(Queuemanager, _mqProperties);
      
      MQQueue queue = _queueManager.AccessQueue(
          Queuename, 
          MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INQUIRE);            
      
      string xml = "";
      
      while (queue.CurrentDepth > 0)
      {
          MQMessage message = new MQMessage();                
          queue.Get(message);
          xml = message.ReadString(message.MessageLength);
          MsgQueue.Enqueue(xml);                    
          message.ClearMessage();                                
      }
      

      Message 内部一定有某些内容会在将其重用于另一个 get 时出错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多