4

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

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

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

4

3 回答 3

6

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

  1. 具有等待间隔 UNLIMITED 和 MQGMO_FAIL_IF_QUIESCING 的 MQGET
  2. 让您的应用程序由 MQServer 触发
  3. 回调函数 - 两侧新增 MQ V7
于 2012-11-26T14:00:34.797 回答
4

您缺少 上的MQC.MQGMO_WAIT标志MQGetMessageOptions.Options。以这种方式更改它:

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 时调用线程不会被阻塞。

可以在此处找到有关 XMS .NET 的更多详细信息。MQ 还附带了示例,对于消息侦听器示例,请参阅“SampleAsyncConsumer.cs”源文件。

于 2012-11-27T08:54:48.370 回答
2

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

_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 时出错。

于 2013-05-29T14:42:12.593 回答