Spring 定时之 @Scheduled,你真正了解嘛?
众所周知,@Scheduled 一个spring定时注解,让定时如此简单。
这里只想说明以下几个问题 ↓
问题说明:
此定时器分为三种类型 ↓
(1)cron 到点执行
(2)fixedRate 间隔多久执行
(3)fixedDelay 上一次任务后多久执行
上面的概念很容易理解,通俗易记;但需要明白下面几个场景:
- 使用cron时,如果设置为每隔1min执行一次,当上一次任务在一分钟之内没有执行完,那下一次任务会阻塞还是会执行?如果会执行什么时候执行,立即执行?
- 同理,当使用fixedRate时,如果设置为间隔1s执行一次,一个任务在一秒未执行完,下一次是否会阻塞,下一次执行是在什么时候?
- 多个任务同时使用cron时,他们之间的执行耗时会对其他任务有影响嘛?
- 多个任务三种模式混用,他们之间的耗时会对其他任务产生影响嘛?
问题答案1、2答案:
弄明白问题1、2只需要看下面这张图-三种定时任务执行周期图:
引用说明出处,此图借鉴于 https://www.cnblogs.com/zouhong/p/11332126.html
问题3、4答案:
多个任务使用cron或者多任务混合使用三种定时类型,他们之间都是会互相影响的;eg:一个任务在执行,另一个任务即使到了执行时间也需等待前一个任务执行完再执行,因为@Scheduled 定时任务是单线程的,截图为证:
所以如果多个任务之间不想互相影响,可以加大线程数,具体数量依任务数而定,Spring 1.5.8配置代码如下(其他版本可能不同):
@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(6); return taskScheduler; }