聊聊SpringBoot的@Scheduled的并發(fā)問(wèn)題
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ù)
@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();
}
}
}
@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)類中加入如下配置即可
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(50);
return taskScheduler;
}
如果是xml
<!-- 注解式 --> <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í)行,需要在配置文件中配置如下
queue-capacity="500" rejection-policy="CALLER_RUNS" /> scheduler="scheduler" />
具體可以參考spring 幫助文檔對(duì)annotation-driven的executor和scheduler的解釋
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot定時(shí)任務(wù)動(dòng)態(tài)擴(kuò)展ScheduledTaskRegistrar詳解
- SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀
- 解決SpringBoot中的Scheduled單線程執(zhí)行問(wèn)題
- SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
- SpringBoot項(xiàng)目中使用@Scheduled讀取動(dòng)態(tài)參數(shù)
- springboot定時(shí)任務(wù)@Scheduled執(zhí)行多次的問(wèn)題
- SpringBoot?Schedule調(diào)度任務(wù)的動(dòng)態(tài)管理
相關(guān)文章
SpringMVC @RequestMapping注解應(yīng)用方法示例講解
詳解Java?二叉樹(shù)的實(shí)現(xiàn)和遍歷
java Spring AOP詳解及簡(jiǎn)單實(shí)例
關(guān)于BeanUtils.copyProperties(source, target)的使用
SpringBoot集成Kafka的實(shí)現(xiàn)示例

