0

私のプロセスは JMS トピックをリッスンしています。メッセージを受信すると、それを処理してリストに追加します。言う

  List<ProcessedMessage>

このリストを XMLGenerator に送信する必要があります。しかし、そうする前に5分間待って/眠りたい.

5分後、リストのサイズは関係ありません。XMLGenerator メソッドに転送したい。

Thread.sleep(5*60*1000) は安全ですか、それともすべてのスレッドをスリープ状態にして、メッセージを運び、5 分のスリープ後にすべてのスレッドを起動しますか? それがメインスレッドになるかどうかはわかりません。助けてください。

4

3 に答える 3

2

JMS メッセージ処理コードで sleep() を使用することは、実際には良い考えではありません。接続リソースを拘束し、タイムアウトのいずれか (トランザクションまたは接続タイムアウトなど) に遭遇する可能性が非常に高いため、長い遅延では機能しません。

より良い実装は、メッセージのリスト (MessagesCollector) を保持する別のクラスを用意することです。このクラスのインスタンスは 1 つだけです。JMS メッセージ処理コードは MessagesCollector にメッセージを追加し、すぐに正常に返されます。次に、タイマーによって 5 分ごとにトリガーされる MessageCollector の別のメソッドを使用できます。このメソッドは、これまでに収集されたメッセージの数を取得して XMLGenerator に送信し、後でコレクションをクリアします。MessageCollector 実装で同期を正しく処理するようにしてください。

MessageCollector の署名は次のようになります。

public MessageCollector {
  public synchronized void addMessage(Object message);
  public synchronized void sendCollectedMessages();
}

上記のコードでは、JMS 処理コードが addMessage() を呼び出し、タイマーが sendCollectedMessages() を呼び出します。

于 2013-10-24T20:04:08.323 に答える
0

Thread.sleep は、すべてのスレッドではなく、現在のスレッドのみをスリープ状態にします。

あなたの場合、 Thread.sleep を onMessage コールバックに入れるべきではありません。

いくつかのタイマー サービスは、おそらく進むべき道でしょう。または、スリープしてからメッセージを送信するスレッドを簡単にインスタンス化できます。他の回答で述べたように、同時に書き込むことができるメッセージのリストを空にするときは、同時実行に注意してください。

于 2013-10-26T22:37:24.673 に答える