2016-08-29 16 views
1

Webアプリケーションでプロファイルを更新した後、電子メールを送信してアクティビティログを更新したいとします。メールを送信してアクティビティログを更新するために、スレッドを使用して、プロファイルの更新応答をクライアントに直ちに送り返し、サブシーケンス操作をスレッドで処理できるようにしたいと考えています。実装を提案してください。Spring MVCでのマルチスレッドコンセプトの使用方法

+0

プロファイルテーブルにフラグ列を保持します。 cron式を使って別々のcronジョブを書く必要があります。別のロジックをメソッドに記述し、そのメソッドをcron job executeメソッドで呼び出します。このメソッドは、フラグを使用して検索を実行する必要があります。機能が実行される必要があるレコードは何ですか。電子メール(およびアクティビティログ)を送信した後、フラグを更新できます。 – Sanka

+0

必ずしもフラグを追加する必要はありません。さらに、コードの実装について知りたいと思います。 – abhiagNitk

+0

Ok。電子メールサーバーのクラッシュまたはアプリケーションサーバーのシャットダウンプロセスが発生しました。セッションが終了し、このプロセスで未処理のものをキャプチャすることはできません。 – Sanka

答えて

1

これを達成する方法はたくさんありますが、Spring MVCアプリケーションはほとんど無関係です。

は、Java 8を使用している場合、あなたは単にあなたがそのプールからのスレッドを与えるためにエグゼキュータのサービス時に呼び出すことができます。

String emailAddress = //get email address... 
    ExecutorService executorService = Executors.newSingleThreadExecutor(); 
    executorService.submit(() -> { 
     emailService.sendNotification(emailAddress); 
    }); 

前のJava 8:

final String emailAddress = ""; 
Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     emailService.sendNotification(emailAddress); 
    } 
}); 
thread.start(); 

あなたの場合より複雑なアプリケーションを作成すると、メッセージキュー(ActiveMQは良い)を使用する可能性があります。これにより、より多くの非同期タスクを追加する際に、より多くの制御と可視性とスケールが可能になります。同時に多数の登録がある場合、スレッドのアプリケーションサーバーを枯渇させません。

+0

あなたの提案をありがとう。 – abhiagNitk

1

BlockingQueueを使用して、プロデューサ - コンシューマモデルを実装して、問題を解決できます。既存のプログラムはプロデューサーとして機能し、BlockingQueueにトークンを追加し、Executor(Executors.newFixedThreadpoolから作成されます)は後続のすべての操作を実行できます。 Javadocを参照して、Springコンテキストを(XMLまたは注釈として)作成することができます。

また、あなたは良いアイデアではありません、プロファイルを保存するときのように送信し、電子メールにスレッドを生成し、CompletionSerive

を参照することができます。多すぎるスレッドが発生し、コンテキストの切り替えによって完了が遅れることがあるためです。したがって、提案は固定スレッドプールを使用する。

JMSキューを使用できます。しかし、それは与えられたシナリオにとって過度のもののように見えます。したがって、BlockingQueueを使用することをお勧めします。

+0

ありがとうございます。 – abhiagNitk

関連する問題