0

次のようにキューからメッセージを取得するMQConsumerClassがあります。

while (running)
{
    try
    {
        MQMessage rcvMessage = new MQMessage();
        MQGetMessageOptions gmo = new MQGetMessageOptions();

        gmo.options = MQConstants.MQGMO_WAIT;
        gmo.waitInterval = 60000; 
        queue.get(rcvMessage, gmo);

        if(rcvMessage.getTotalMessageLength() > 0)
        {
            String msgText = rcvMessage.readUTF();
        }
    }
    catch blocks{}
}

ただし、問題は、キューにメッセージがない場合、2033例外がスローされることです。

2033 NO_MSG_AVAILABLE例外は、おそらく操作を停止する可能性のある重大な例外ではないと思います。

onMessage(Message msg)ただし、キューに新しいメッセージがあるときはいつでも関数を呼び出したいと思います。

MessageListenerを使用してこのクラスを作成したいのですが、MessageListenerまたはそれに関連する例が見つかりません。

それで、WMQJavaAPIにMessageListener関数があるかどうか教えてください。

また

これを行う方法はありますか?

4

4 に答える 4

5

2033の「エラー」は実際にはエラーではなく、MQSeriesの戻りステータスに近いものです。MQRC_NO_MSG_AVAILABLE2033 MQTesterプログラムはキューをポーリングしてメッセージを探していますが、使用可能なメッセージがありません。

あなたはそれを除外することができます

MQException.logExclude(new Integer(MQException.MQRC_NO_MSG_AVAILABLE));

于 2012-11-09T14:27:48.033 に答える
1

WMQ Java API にはメッセージ リスナーがありません。JMSのようなものonMessageはなく、同期受信のみ。

于 2012-06-29T07:00:32.137 に答える
1

MQConstants.MQWI_UNLIMITEDを使用 して、無制限の待機間隔を指定できます。

while (running) {
      MQGetMessageOptions gmo = new MQGetMessageOptions();
      gmo.options = MQConstants.MQGMO_WAIT; 
      gmo.waitInterval = MQConstants.MQWI_UNLIMITED;

  try {
      // Get the message off the queue.
      queue.get(rcvMessage, gmo);
  } catch (MQException e) {
    if (e.reasonCode == 2033) {
        continue;
  }

}

}

于 2013-09-02T16:19:47.790 に答える
1

この種のループでは、これらの 2033 の「メッセージなし」例外を完全に回避することはできません。待機間隔を長くすることで、(完了時にアプリケーションの終了が遅くなる可能性があることを除いて) いくつかの欠点があり、get 呼び出しごとにメッセージの取得に失敗する可能性が減ります。たとえば、待機間隔を 5 分に指定した場合、少なくとも 1 つのメッセージが 5 分ごとにキューに到着する限り、すべての get 呼び出しが (通常) メッセージを受信します。ただし、待機間隔内にメッセージが見つからない場合があるため、その種の例外にはまだ catch ブロックが必要です。待機間隔が短すぎない限り、失敗した get、catch ブロック、およびループの再スピンのパフォーマンス オーバーヘッドは比較的小さいはずです。

メッセージが使用可能になったときにアプリケーションが呼び出される非同期コンシューマーを実際に使用したい場合、WebSphere MQ classes for JMS は MessageListener インターフェースを見つける Java API です。WebSphere MQ は、Java 用に 2 つの異なる API を公開します。コード スニペットは、JMS ではなく WebSphere MQ classes for Java を使用しています。

于 2012-06-29T14:05:26.453 に答える