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

このポーリング メカニズムを回避または削減するには、3 つの方法があります。ここでは、エレガンスの順序で示しています (高いほど良い)。

  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 Message Service Client(別名XMS .NET)と呼ばれる別のクライアントがあり、.NETでJMS仕様の実装を提供します。Message Listenerこれには、メッセージがキューに到着するたびに自動的に呼び出されるちょっとした機能があります。上記の例とは異なり、メッセージリスナーが使用されている場合、呼び出し元のスレッドはブロックされません。

XMS .NETの詳細については、こちらをご覧ください。サンプルはMQにも同梱されており、メッセージリスナーのサンプルについては、「SampleAsyncConsumer.cs」ソースファイルを参照してください。

于 2012-11-27T08:54:48.370 に答える