我有多個組件,其中有@Scheduled
註釋,並且我看到Spring一次只啓動一個組件,即使它們計劃在同一時間運行。在自己的線程中運行每個Spring Scheduler
我的用例如下。我希望每個@Scheduled註釋在其自己的線程中運行,但每個線程只能運行一次。
鑑於這種僞代碼與兩個調度:
@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);
}
注意任務花費的時間比調度計劃運行更長的時間。這是至關重要的。我不希望調度程序在完成運行之前再次啓動。
運行這段代碼的開箱給我這樣的輸出:
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
我怎樣才能做到這一點? 我希望每個調度程序能夠同時運行,但請等到它完成後再允許再次運行。 請記住,我有兩個以上的調度程序在相同的時間運行,有時甚至是不同的時間。
'Executor'用'synchronize'可以幫助 – Ashish