簡體   English   中英

C#MQ Api如果在空隊列的情況下獲取異常,如何獲取消息

[英]C# MQ Api How to fetch message without getting exception in case of empty queue

我必須定期檢查Websphere MQ中隊列中的消息。 我沒有找到更好的方法,而不是嘗試獲取消息並處理2033原因代碼(這是NO_MSG_AVAILABLE),如下所示:

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

有更好的方法從隊列中獲取消息嗎? 我認為可能有一些我不知道的openOptions標志,在沒有可用消息時不會拋出異常,而是返回null。

有三種方法可以避免或減少這種輪詢機制。 在這里他們優雅(越高越好):

  1. 具有等待間隔UNLIMITED和MQGMO_FAIL_IF_QUIESCING的MQGET
  2. 使MQServer觸發您的應用程序
  3. 回調函數 - 兩側都帶有MQ V7的新功能

你缺少MQC.MQGMO_WAIT上標志MQGetMessageOptions.Options 這樣改變:

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

請注意,這將使得調用線程被阻塞,直到消息到達隊列或發生某些連接異常。 MQ有另一個名為IBM Message Service Client(又名XMS .NET)的客戶端,它在.NET中提供JMS規范實現。 這有一個很好的小Message Listener ,只要消息到達隊列就會自動調用它。 與上面的示例不同,使用Message Listener時不會阻止調用線程。

有關XMS .NET的更多詳細信息,請訪問此處 樣本也附帶MQ和消息監聽器示例,請參閱“SampleAsyncConsumer.cs”源文件。

我得到了這個。 我通過將Message initiator放在循環中來解決它:

_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();                                
}

內部消息中必須存在一些錯誤,當重新使用它時會出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM