発信キューが必要なメッセージ処理アプリケーション (電子メール) を作成しています。私がこれを設計した方法は、Executor Service と BlockingQueue に支えられたシングルトン キュー クラス ThreadedQueueSender を持つことです。さらに、javax.mail.Transport オブジェクトのスレッド プールを使用して、発信 SMTP サーバーへの接続を取得および解放します。
add(MimeMessage)
このクラスは、ワーク キュー ( ) にメッセージを追加するメソッド を公開しますBlockingQueue
。
クラスのインスタンス化時に、ExecutorService
は固定数のスレッド (5 としましょう) に初期化されThreadPoolExecutor
ます。各スレッドのメソッドは、割り込みを検出したとき (が呼び出されたとき)run()
にのみ終了する無限ループにあります。ExecutorService.shutdownNow()
この run メソッドはBlockingQueue.poll()
、使用可能なメッセージがなくなるまでブロックせずにワーク キューからメッセージを取得するために使用します。次にTransport
、接続プールからオブジェクトを要求し、接続を開き、取得したすべてのメッセージを送信し、接続を閉じて、Transport
オブジェクトを返します。
これは機能しますが、アプリケーションの存続期間中に実行されるスレッドの数が固定されているため、ExecutorService を十分に活用していないと感じています。また、同時実行フレームワークに処理させるのではなく、自分でワーク キューを管理しています。他の人はこの機能をどのように実装しますか? 各受信メッセージを Runnable でラップしてから、送信ロジックを実行する方がよいでしょうか?
ありがとうございます。コメントをお待ちしております。
ライアン