聊聊SpringBoot的@Scheduled的并发问题

网友投稿 1108 2022-11-26

聊聊SpringBoot的@Scheduled的并发问题

聊聊SpringBoot的@Scheduled的并发问题

目录SpringBoot @Scheduled的并发spring @Scheduled 并发执行

SpringBoot @Scheduled的并发

由于SpringBoot自带的@Scheduled是一个阻塞执行的定时任务,所以效率会很慢,就会造成同PqVoCVJZ一个时间段内只有一个定时任务在执行,其余的就会阻塞

现有两个定时任务

@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();

}

}

}

@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秒执行。

解决方法是在启动项类中加入如下配置即可

@Bean

public TaskScheduler taskScheduler() {

ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();

taskScheduler.setPoohttp://lSize(50);

return taskScheduler;

}

如果是xml

spring @Scheduled 并发执行

spring @Scheduled ,默认基于单线程执行,如果需要基于多线程执行,需要在配置文件中配置如下

queue-capacity="500" rejection-policy="CALLER_RUNS" />

scheduler="scheduler" />

具体可以参考spring 帮助文档对annotation-driven的executor和scheduler的解释

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python numpy
下一篇:【Android -- 实战】APP 的开发流程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~