18

メッセージリスナーを一時的に無効にするための優れた方法は何でしょうか。私が解決したい問題は次のとおりです。

  • JMSメッセージがメッセージリスナーによって受信されます
  • メッセージを処理しようとするとエラーが発生します。
  • システムがメッセージを処理できるように再び準備ができるのを待ちます。
  • システムの準備が整うまで、これ以上メッセージは必要ないので...
  • ...メッセージリスナーを無効にしたい。
  • 私のシステムは再び処理する準備ができています。
  • 失敗したメッセージが処理され、JMSメッセージが確認応答されます。
  • メッセージリスナーを再度有効にします。

現在、SunAppServerを使用しています。MessageConsumerでメッセージリスナーをnullに設定して無効にし、setMessageListener(myOldMessageListener)を使用して再度有効にしましたが、その後メッセージが表示されなくなりました。

4

7 に答える 7

15

onMessage()システムがメッセージを再び処理する準備ができるまで、リスナー メソッドから戻らない場合はどうでしょうか。これにより、JMS がそのコンシューマーに別のメッセージを配信できなくなります。

receive()これは、同期の場合に呼び出さないことと同等の非同期です。

onMessage()特定の JMS セッションにはマルチスレッドがないため、メッセージのパイプラインはメソッドが戻るまで保留されます。

を動的に呼び出すことの意味に慣れていませんsetMessageListener()。javadoc は、「メッセージが既存のリスナーまたは同期コンシューマーによって消費されている場合」に呼び出された場合、未定義の動作があると述べています。内から呼び出しているonMessage()場合は、その未定義のケースに遭遇しているように聞こえます。

それがあなたにとって粗すぎない場合は、接続レベルで開始/停止メソッドがあります。

于 2009-03-09T22:49:38.563 に答える
5

メッセージ リスナーを receive() ループに置き換える回避策によって問題は解決しましたが、メッセージ リスナーを無効にしてすぐに再度有効にする方法にまだ興味があります。

于 2009-03-09T20:39:02.993 に答える
0

メッセージが配信されているように見えますが、リスナーが接続されていないため、メッセージで何も起こっていません。JMS で何かをしてからしばらく経ちましたが、システムを修正している間にメッセージをデッド レター キューなどに送信し、修正が完了したらメッセージを元のキューに戻したくありませんか?再処理の準備はできていますか?

于 2009-03-09T11:56:06.247 に答える
0

電話してもいいと思います

messageConsumer.setMessageListener(null);

MessageListener 実装内で再確立タスクをスケジュールします (たとえば、ScheduledExecutorService で)。このタスクは呼び出す必要があります

connection.stop();
messageConsumer.setMessageListener(YOUR_NEW_LISTENER);
connection.start();

そしてそれは働くでしょう。start() および stop() メソッドは、配信構造を再開するために使用されます (TCP 接続ではありません)。

Javadoc を読むhttps://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#stop--

着信メッセージの接続の配信を一時的に停止します。配信は、接続の start メソッドを使用して再開できます。接続が停止すると、すべての接続のメッセージ コンシューマーへの配信が禁止されます。同期受信がブロックされ、メッセージはメッセージ リスナーに配信されません。

于 2016-08-06T09:37:33.667 に答える
0

WebLogic では、最大再試行回数、最大再試行制限を超えるメッセージを処理するためのエラー キュー、およびその他のパラメーターを設定できます。頭の中で定かではありませんが、待機期間を指定できる場合もあります。これらはすべて、管理コンソールで利用できます。あなたが持っている JMS プロバイダーの管理者を見て、同様のことができるかどうかを確認します。

于 2009-03-09T13:11:30.120 に答える
0

受信メッセージの接続の配信を一時的に停止するには、インターフェースstop()からメソッドを使用する必要があります: https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#stop--Connection

JMS 仕様によるためconnection.stop()、from を呼び出さないでください。MessageListenerデッドロックまたは例外が発生します。代わりに、別のスレッドから呼び出すことができます。関数との接続を一時停止するスレッドconnection.stop()を同期してスレッド化するだけです。MessageListenerconnection.stop()

于 2018-02-01T14:07:12.113 に答える