SpringBoot @Scheduled的并發(fā)
由于SpringBoot自帶的@Scheduled是一個(gè)阻塞執(zhí)行的定時(shí)任務(wù),所以效率會(huì)很慢,就會(huì)造成同一個(gè)時(shí)間段內(nèi)只有一個(gè)定時(shí)任務(wù)在執(zhí)行,其余的就會(huì)阻塞
現(xiàn)有兩個(gè)定時(shí)任務(wù)
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執(zhí)行時(shí)間:" + new Date()); Thread.sleep( 65000 ); System.out.println( "aa完成時(shí)間:" + 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執(zhí)行時(shí)間:" + new Date()); Thread.sleep( 10000 ); System.out.println( "bb完成時(shí)間:" + new Date()); } catch (Exception e) { e.printStackTrace(); } } |
默認(rèn)的在啟動(dòng)項(xiàng)加入@EnableScheduling注解就可以運(yùn)行了
最終,執(zhí)行的結(jié)果令人大跌眼鏡。
aa的任務(wù)由于執(zhí)行時(shí)間需要65秒,超過(guò)了bb任務(wù)執(zhí)行的時(shí)間,結(jié)果bb任務(wù)執(zhí)行的時(shí)間被阻塞掉,延遲了5秒執(zhí)行。
解決方法是在啟動(dòng)項(xiàng)類(lèi)中加入如下配置即可
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 并發(fā)執(zhí)行
spring @Scheduled ,默認(rèn)基于單線程執(zhí)行,如果需要基于多線程執(zhí)行,需要在配置文件中配置如下
1
2
|
queue-capacity="500" rejection-policy="CALLER_RUNS" /> scheduler="scheduler" /> |
具體可以參考spring 幫助文檔對(duì)annotation-driven的executor和scheduler的解釋
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/weixin_43958556/article/details/116456909