聊聊SpringBoot的@Scheduled的并發(fā)問題
SpringBoot @Scheduled的并發(fā)
由于SpringBoot自帶的@Scheduled是一個阻塞執(zhí)行的定時任務(wù),所以效率會很慢,就會造成同一個時間段內(nèi)只有一個定時任務(wù)在執(zhí)行,其余的就會阻塞
現(xiàn)有兩個定時任務(wù)
@Component("aa")
public class aa {
@Scheduled(cron = "0 44 17 * * ?")
public void bb() {
try {
System.out.println("aa執(zhí)行時間:" + new Date());
Thread.sleep(65000);
System.out.println("aa完成時間:" + 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í)行時間:" + new Date());
Thread.sleep(10000);
System.out.println("bb完成時間:" + new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
默認(rèn)的在啟動項加入@EnableScheduling注解就可以運(yùn)行了

最終,執(zhí)行的結(jié)果令人大跌眼鏡。

aa的任務(wù)由于執(zhí)行時間需要65秒,超過了bb任務(wù)執(zhí)行的時間,結(jié)果bb任務(wù)執(zhí)行的時間被阻塞掉,延遲了5秒執(zhí)行。
解決方法是在啟動項類中加入如下配置即可
@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 幫助文檔對annotation-driven的executor和scheduler的解釋
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC @RequestMapping注解應(yīng)用方法示例講解
關(guān)于BeanUtils.copyProperties(source, target)的使用

