SpringBoot>16 - 使用@Scheduled实现定时任务

简介:

实现定时任务的方式很多,基于JDK的Timer、Quartz等等,本章介绍 SpringBoot1.5 中Spring Task实现定时任务,非常方便。

项目构建:

springboot web项目构建完就默认内置了@Scheduled 定时任务。

1、开启定时支持,在启动类上添加注解@EnableScheduling

 // mapper 接口类扫描包配置
@MapperScan("com.coolron.*.dao")
@SpringBootApplication
// 开启定时支持
@EnableScheduling
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

2、定时任务
2.1、@Scheduled 的四个属性
在线 cron 表达式生成器:http://cron.qqe2.com/

1、cron属性:
指定具体的时间点,cron表达式可以完成任意的时间搭配,必须六或七个域,中间使用空格隔开,
从前完后依次为:秒(1-59)、分(1-59)、时(1-23)、日(1-31)、月(1-12)、星期(1-7)、年(~2099)
特殊字符:
*:匹配该域的任意值
-:表示范围,例如:0 0 9-17 * * *   每天朝九晚五时间内的0分0秒触发
/: 时间间隔,例如:5/10 * * * * *    每一分钟的5秒、15秒、25秒... 触发
,:枚举值, 例如:0 0 9,18 * * ?   在每天9点和下午6点整触发 
: 任意值,只能用到日、星期两个域  注意星期和日这两个域的冲突
例子:
#:0 0 12 * * ?   每天中午12点触发 
#:0 0/5 8 * * ? 每天8点到8:55期间的每5分钟触发 
#:0 0-10 20 * * ?  每天20点到20:10期间的每1分钟触发

2、fixedRate属性:
时间间隔   上一次调用开始后再次调用的间隔

3、fixedDelay属性:
时间间隔   上一次调用完成后再次调用的间隔

4、initialDelay属性:
只是做第一次执行前的延时  配合 fixedDelay 和 fixedRate 使用

2.2、创建定时任务

/**
 * @Auther: xf
 * @Date: 2018/11/25 14:01
 * @Description:  定时任务
 */
@Slf4j
@Component
public class MyTask {

    /**
     * 指定具体的时间点去执行
     * 效果:具体时间点的 10秒 20秒 30秒... 执行
     */
    @Scheduled(cron = "0/10 * * * * ?")
    private void cornTest() {
        log.info(">>>>>corn 执行时间:{}", new Date());
    }

    /**
     * 上一次调用开始后再次调用的间隔
     * 效果:第一次调用开始 5 秒调用第二次 不管前一次是否调用完成
     */
    //@Scheduled(fixedRate = 1000 * 5)
    private void fixedRateTest() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info(">>>>>fixedRate 执行时间:{}", new Date());
    }

    /**
     * 上一次调用完成后再次调用的间隔
     * 效果:第一次调用完 5 秒之后调用第二次
     */
    // @Scheduled(fixedDelay = 1000 * 5)
    private void fixedDelayTest() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info(">>>>>fixedDelay 执行时间:{}", new Date());
    }

    /**
     * initialDelay 只是做第一次执行前的延时  配合 fixedDelay 和 fixedRate 使用
     * 效果: 第一次执行之前延时 5 秒
     */
    //@Scheduled(initialDelay = 1000 * 5, fixedDelay = 1000 * 2)
    //@Scheduled(initialDelay = 1000 * 5, fixedDelay = 1000 * 2)
    private void initialDelayTest() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info(">>>>>initialDelay 执行时间:{}", new Date());
    }
}

3、测试:启动项目即可看到对应效果

总结:

@Scheduled 定时任务使用较多的是 cron 和 fixedDelay 属性,fixedRate 是从上一次调用开始后计时,不管上一个任务是否完成,这样容易产生重复操作,慎用。这里的调度使用的是同一个线程,建议另外开线程执行,多线程将在后面章节涉及。

个人学习分享
更多 springboot、springcloud、docker 文章关注微信公众号吧:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cp026la/article/details/86507248