基础使用
@Scheduled注解于方法上,与@EnableScheduling搭配使用
属性 | 释义 |
---|---|
cron | cron表达式,使用过Quartz的都知道 |
zone | corn表达式的时区 |
initialDelay | 首次执行的延迟时间。如果不使用corn表达式(使用fixedDelay或者fixedRate),项目启动后会马上执行一次Task,这个延时就是项目启动后第一次执行的延时 |
fixedDelay | Task执行的时间间隔,从上一次任务结束计算,受任务执行时间影响 |
fixedRate | Task执行的时间间隔,从上一次任务开始计算,不受任务执行时间影响 |
关于fixedDelay和fixedRate:
比如某个Task从0秒开始执行,任务执行需要15秒
-
如果fixedDelay为10,那么任务执行的时间应该为:
第0秒第一次执行,执行15秒,fixedDelay10秒,第二次执行为第25秒,任务执行15秒,fixedDelay10秒,第三次执行为第50秒。 -
如果fixedRate为10,那么任务执行的时间应该为:
第0秒第一次执行,不管任务执行多少秒,fixedRate10秒,第二次执行为第10秒,第三次执行为第20秒...
另外,如果使用cron表达式,那么项目启动时不会立即执行一次,而是必须等到表达式的周期才会执行。
关于并发
如果使用@Scheduled定义了多个Task,默认情况下是单个线程去执行。任务之间会相会影响。
比如定义了两个定时任务,必须要等第一个执行结束后才会执行第二个。
多任务并发,可以使用@EnableAsync注解开启异步多线程执行。
然后在需要多线程执行的@Scheduled Task任务上注解@Async
代码示例
@Slf4j
@Component
@EnableAsync
public class InternalCleanTask {
@Async
@Scheduled(initialDelay = 1000*10 , fixedDelay = 1000 * 10)
public void cleanTimerJob() {
log.info("clean timer job");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("clean timer job end");
}
@Async
@Scheduled(initialDelay = 1000*10 , fixedDelay = 1000 * 10)
public void cleanPushTemplate() {
log.info("clean push template");
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("clean push template end");
}
}
网友评论