2017-04-21 9 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を調べることもできます。また、上記のほぼ正確なコードを使用して、キュー上のメッセージをリッスンしながらスレッドをブロックすることができます。

EDIT:メッセージがトリガキューに到着するたびに(毎回)、またはメッセージが初めてトリガキューに到着したとき(最初に)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); 
     } 
    } 
} 
関連する問題