Spring @Scheduled注解备忘录

基础使用

@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");
    }
}

你可能感兴趣的:(Spring @Scheduled注解备忘录)