私は@Scheduled
というアノテーションを持つ複数のコンポーネントを持っていますが、同じ時間に実行するようにスケジュールされていても、Springは一度に1つずつしか起動しません。各スレッドスケジューラを独自のスレッドで実行する
私の使用例は次のとおりです。私は各@Scheduledアノテーションを独自のスレッドで実行するが、スレッドごとに1回しか実行しない。タスクスケジューラを実行するようにスケジュールされるよりも長い時間がかかること
@Scheduled(cron = "0 * * * * *") //run every minute
public void methodA() {
log.info("Running method A");
executeLongRunningJob("Finished method A");
}
@Scheduled(cron = "0 * * * * *") //run every minute
public void methodB() {
log.info("Running method B");
executeLongRunningJob("Finished method B");
}
private void executeLongRunningJob(String msg) {
Thread.sleep(70 seconds);
System.out.println(msg);
}
注:
は2つのスケジューラと、この擬似コードを考えます。これは非常に重要です。私は、スケジューラの実行が完了する前に再開したくありません。箱から出して、このコードを実行する
は私にこの出力を与える:
Running method A
Finished method A
Running method B
Finished method B
Running method A
Finished method A
Running method B
Finished method B
... and so on
だから、明らかにそのは、シングルスレッドで両方のスケジューラを実行しています。私は高価な方法で@Async
を置く
新しいスケジューラが開始される前に、高価なメソッドが終了していないことを除いて、その後、私はほとんど、正しい動作を取得。この出力
Running method A
Running method B
Running method A
Running method B
Finished method A
Finished method B
... and so on
私が希望です:
Running method A
Running method B
Finished method A
Finished method B
Running method A
Running method B
Finished method A
Finished method B
... and so on
どのように私はこれを達成することができますか? 各スケジューラを同時に実行したいが、もう一度実行する前に終了するまで待つ。 私は、複数のスケジューラが同じ時に実行されることがあります。
'' synchronize'とExecutor'は – Ashish