SpringBoot 自带的 Schedule, 可以将它看成一个轻量级的 Quartz, 而且使用起来比 Quartz 简单许多
以下任务都是在单线程下执行的
第一步 创建 SpringBoot 项目
第二步 外汇返佣 http://www.fx61.com/, 添加 @EnableScheduling 开启定时任务
第三步 设置定时需要执行的任务
有两种方法设置执行时机
第一种我们就且叫他为普通方法
1.fixedRate: 会为所有任务的开始执行时间编排一个表, 假如 fixedRate=5000, 且第一次开始时间是 10:00:00
任务 开始执行时间
任务 1 10:00:00
任务 2 10:00:05
任务 3 10:00:10
任务 4 10:00:15
任务 5 10:00:20
当执行任务耗时小于 fixedRate 设置的时间时, 将会按照表中的开始时间执行任务, 即每隔 5 秒会执行一个任务:
- @Component
- public class TestScheduling {
- private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- @Scheduled(fixedRate=5000)
- public void myTask() throws InterruptedException {
- LOG.info("执行时间:{}",sdf.format(new Date()));
- }
- }
当执行任务耗时大于 fixedRate 设置的时间时, 以下一张图就很清楚的表示了(图的出处)
解析一下:
fixedRate 设置的也是为 fixedRate=5000
第一个任务开始执行时间是 0:00, 耗时 8 秒
第二个任务本应该开始执行时间是 0:05, 但是第一个任务执行完时间已经是 0:08, 所以第二个任务在第一个任务执行完毕之后会立即执行, 耗时是 3s
第三个任务本应该开始执行时间是 0:10, 但是前两个任务执行完毕时间已经是 0:11, 所以第三个任务在第二个任务执行完毕之后会立即执行, 耗时是 6s
第四个任务, 也同第二, 第三个任务一样, 在预计开始执行的时间(这里第四个任务预计开始执行时间是 0:15), 因为上一个任务还没有执行完毕, 所以要等待上一个人执行完毕之后才会执行.
第五个任务预计开始执行时间是 0:20, 而前四个任务在 0:19 已经执行完毕, 需要等待 1 秒, 到达我们预计的开始执行时间 (0:20) 才会执行第五个任务.
2.fixedDelay
这个就比之前的 fixedRate 简单得多. 如设置 fixedRate=5000. 下一个任务只需要盯着上一个任务的屁股 (执行完毕的时间) 就行了. 上一个任务执行完毕 5 秒之后, 下一个任务就会开始执行
- @Component
- public class TestScheduling {
- private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- @Scheduled(fixedDelay=5000)
- public void myTask(){
- LOG.info("开始执行时间:{}",sdf.format(new Date()));
- try {
- Thread.sleep(8000);// 让任务执行的耗时时间为 8 秒, 有利于我们的观察
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- LOG.info("执行完毕时间:{}",sdf.format(new Date()));
- }
- }
- 3.initialDelay
用于配合 fixedRate 和 fixedDelay 使用的, 作用是在容器启动后经过多长时间才开始执行第一次任务.
4. 扩展一下
我们先看下一下 @Scheduled 注解里面有什么
fixedDelayString,fixedRateString 和 initialDelayString 不就是我们上面讲的三个加个字符串嘛, 之前的三个都是 long 类型, 这三个是 String 类型, 顾名思义, 不就是用字符串表示嘛. 作用其实就是为了能在 application.properties 配置
- @Component
- public class TestScheduling {
- private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- @Scheduled(initialDelay = 5000,fixedDelayString = "${com.liang.scheduled:5000}")
- public void myTask(){
- LOG.info("开始执行时间:{}",sdf.format(new Date()));
- try {
- Thread.sleep(8000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- LOG.info("执行完毕时间:{}",sdf.format(new Date()));
- }
- }
:5000 作用是防止 application.properties 没有配置 com.liang.scheduled 属性则使用默认的 5000(如果没有写: 5000 且 application.properties 没有配置 com.liang.scheduled 属性会报异常)
执行结果: 和我们预计的一样, 下一次开始执行时间与上一次结束时间间隔正好是 10 秒. 如果去掉 application.properties 中的 com.liang.scheduled 属性, 则间隔时间是默认的 5 秒, 这个自行验证.
几乎大部分的应用都会有定时执行任务的需求. 使用 Spring Boot 的 Scheduling Tasks 能够提高您的开发效率. 这篇文章将介绍怎么通过 Spring Boot 去做调度任务.
构建工程
创建一个 Springboot 工程, 在它的程序入口加上 @EnableScheduling, 开启调度任务.
- @SpringBootApplication
- @EnableScheduling
- public class SpringbootScheduledApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootScheduledApplication.class, args);
- }
- }
创建定时任务
创建一个定时任务, 每过 2s 在控制台打印当前时间.
- @Component
- public class ScheduledTasks {
- private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
- private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
- @Scheduled(fixedRate = 2000)
- public void reportCurrentTime() {
- log.info("The time is :" + dateFormat.format(new Date()));
- }
- }
来源: http://www.bubuko.com/infodetail-3185906.html