美文网首页
Spring @Scheduled注解备忘录

Spring @Scheduled注解备忘录

作者: vayci | 来源:发表于2018-11-16 10:46 被阅读0次

    基础使用

    @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注解备忘录

          本文链接:https://www.haomeiwen.com/subject/vjbpfqtx.html