SpringBoot @Scheduled的并發
由于SpringBoot自帶的@Scheduled是一個阻塞執行的定時任務,所以效率會很慢,就會造成同一個時間段內只有一個定時任務在執行,其余的就會阻塞
現有兩個定時任務
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Component ( "aa" ) public class aa { @Scheduled (cron = "0 44 17 * * ?" ) public void bb() { try { System.out.println( "aa執行時間:" + new Date()); Thread.sleep( 65000 ); System.out.println( "aa完成時間:" + new Date()); } catch (Exception e) { e.printStackTrace(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
|
@Component ( "bb" ) public class bb { @Scheduled (cron = "0 55 17 * * ?" ) public void aa() { try { System.out.println( "bb執行時間:" + new Date()); Thread.sleep( 10000 ); System.out.println( "bb完成時間:" + new Date()); } catch (Exception e) { e.printStackTrace(); } } |
默認的在啟動項加入@EnableScheduling注解就可以運行了
最終,執行的結果令人大跌眼鏡。
aa的任務由于執行時間需要65秒,超過了bb任務執行的時間,結果bb任務執行的時間被阻塞掉,延遲了5秒執行。
解決方法是在啟動項類中加入如下配置即可
1
2
3
4
5
6
|
@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize( 50 ); return taskScheduler; } |
如果是xml
1
2
3
4
|
<!-- 注解式 --> < task:annotation-driven executor = "myExecutor" scheduler = "myScheduler" /> < task:executor id = "myExecutor" pool-size = "5" /> < task:scheduler id = "myScheduler" pool-size = "10" /> |
spring @Scheduled 并發執行
spring @Scheduled ,默認基于單線程執行,如果需要基于多線程執行,需要在配置文件中配置如下
1
2
|
queue-capacity="500" rejection-policy="CALLER_RUNS" /> scheduler="scheduler" /> |
具體可以參考spring 幫助文檔對annotation-driven的executor和scheduler的解釋
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_43958556/article/details/116456909