2017-04-21 49 views
1

在沙箱環境中,我正在測試IBM MQ。我已經有了RabbitMq的經驗。IBM MQ v8 - 實時使用發佈的消息

使用IBM MQ,我缺乏直接使用隊列中消息的可能性。 RabbitMQ(Consume()方法)就是這種情況。但是,隨着IBM MQ我必須明確地看在隊列中下面的代碼:

var queue = _queueManager.AccessQueue("queueName", MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING); 

這是我知道的,現在讀從隊列中的消息。但是有沒有人可以幫助我,如果有一種方法可以直接消費一個消息(事件明智,或者換句話說:實時消費,隊列中的項目將成爲開始閱讀它的觸發器),而無需調用上述代碼?

回答

2

您可以看看如何使用XMS .NET客戶端的消息偵聽器在消息到達隊列時消費消息。您需要在項目中引用IBM.XMS程序集。你可以看一下異步消費者樣本Tools\dotnet\samples\cs\xms\simple\wmq\SimpleAsyncConsumer\SimpleAsyncConsumer.cs.

+0

謝謝,更多信息:https://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.msc.doc/xms_cuselisnr_net.htm – Ozkan

1

如果您希望通過消息到達隊列來觸發,您可以配置一個PROCESS,並根據觸發消息將該進程設置爲運行。

或者,您可以查看MQGMO_WAIT,並且可以使用幾乎上面確實的代碼在隊列上偵聽郵件時保持線程阻塞狀態。

編輯:所以你可以設置你的代碼,每當一個消息到達一個觸發器隊列(每一個)時,或者第一次消息到達觸發器隊列(第一個),你的MQ進程就會被調用比如「/path/to/myprog.exe」。傳入的參數將採用MQTriggerMessage的格式,幷包含隊列名稱和其他一些細節。這將允許任何數量的處理任務,假設您在每條消息上設置觸發器。

或者,您可以打開隊列作爲共享,並且多個任務可以等待消息到達隊列中。使用MQOpenOption.INPUT_SHARED標誌。

+0

你是什麼意思的過程?問題是,對於我正在處理的項目,IBMMQ服務器將位於其他位置,我無法對其進行配置。我只有MQ服務器的連接信息和憑據。你會選擇以上哪種選擇? – Ozkan

+0

我對你在找什麼不太清楚,但如果你提供更多的細節,我可以嘗試給出更好的答案。 –

1

但是,隨着IBM MQ我必須明確地看在隊列以下 代碼:

VAR隊列= _queueManager.AccessQueue(「QUEUENAME」,...

你需要做一些更多的閱讀,因爲AccessQueue只打開隊列。你需要使用隊列的get方法來檢索信息。

如果你婉(直到隊列管理器關閉),那麼你可以這樣做:

private void loopForever(MQQueue inQ) 
{ 
    bool flag = true; 
    MQMessage msg = new MQMessage(); 
    MQGetMessageOptions gmo = new MQGetMessageOptions(); 
    gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING; 
    gmo.WaitInterval = MQC.MQEI_UNLIMITED; 

    while (flag) 
    { 
     try 
     { 
     msg = new MQMessage(); 
     inQ.Get(msg, gmo); 
     System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength)); 
     } 
     catch (MQException mqex) 
     { 
     System.Console.Out.WriteLine("MQTest61B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); 
     flag = false; // severe error - time to exit 
     } 
     catch (System.IO.IOException ioex) 
     { 
      System.Console.Out.WriteLine("MQTest61B ioex=" + ioex); 
     } 
    } 
}