聊聊SpringBoot的@Scheduled的并发问题
时间:2022-05-22 08:20:38|栏目:JAVA代码|点击: 次
SpringBoot @Scheduled的并发
由于SpringBoot自带的@Scheduled是一个阻塞执行的定时任务,所以效率会很慢,就会造成同一个时间段内只有一个定时任务在执行,其余的就会阻塞
现有两个定时任务
@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.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 并发执行
spring @Scheduled ,默认基于单线程执行,如果需要基于多线程执行,需要在配置文件中配置如下
queue-capacity="500" rejection-policy="CALLER_RUNS" /> scheduler="scheduler" />
具体可以参考spring 帮助文档对annotation-driven的executor和scheduler的解释
栏 目:JAVA代码
下一篇:Java中浅拷贝和深拷贝详解
本文标题:聊聊SpringBoot的@Scheduled的并发问题
本文地址:http://www.codeinn.net/misctech/202530.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 3Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 4java中-jar 与nohup的对比
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7解析SpringSecurity+JWT认证流程实现
- 8java读取excel文件的两种方法
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




