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() を呼び出します。