欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot之定时调度Scheduled Tasks

程序员文章站 2022-03-02 18:33:07
...

平常项目中经常可能会有一些定时调度的需求,就会需要用到Quartz或者是Scheduled Tasks,Scheduled Tasks相比于Quartz,更为轻量,当然功能上也没有Quartz全面,对于需求不复杂的定时调度,用Schduled Tasks反而会更方便,今天就讲一下Spring Boot中使用Scheduled Tasks。
关于Spring Boot中怎么去使用定时任务,官网这里有给出简单的例子戳我

构建项目

首先我们构建一个Spring Boot项目,不需要向其中添加任何依赖,已经自带了Scheduled Tasks,然后我们需要在启动类中加上注解@EnableScheduling,用以开启定时调度功能。

@SpringBootApplication
@EnableScheduling
public class ScheduledTaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduledTaskApplication.class, args);
    }
}

创建任务

创建一个test类,加上注解@Component,对于这个注解的作用大家都应该知道的,然后对于需要做调度的方法上加上注解@Scheduled,这个注解有几个属性,这里分别简单解释一下
cron—cron表达式,不解释,该懂的
zone—cron表达式使用的时区,默认为本机对应时区
fixedDelay—固定时间间隔执行,即最后一次执行完到下一此执行开始的时间
fixedDelayString—同上,只是参数为String类型
fixedRate—以固定的时间间隔执行
fixedRateString—同上,只是参数为String类型
initialDelay—任务第一次执行前,延迟时间
initialDelayString—同上,只是参数为String类型
下面为我的测试类,对于这几个属性分别测试了一下

@Component
public class TaskTest {

    @Scheduled(cron = "0/5 * * * * ? ")
    public void test1() {
        System.out.println("当前时间:" + LocalTime.now() + "------test1被调度");
    }

    @Scheduled(fixedRate = 5000)
    public void test2() {
        System.out.println("当前时间:" + LocalTime.now() + "------test2被调度");
    }

    @Scheduled(fixedDelay = 5000)
    public void test3() {
        System.out.println("当前时间:" + LocalTime.now() + "------test3被调度");
    }

    @Scheduled(initialDelay = 2000, fixedDelay = 5000)
    public void test4() {
        System.out.println("当前时间:" + LocalTime.now() + "------test4被调度");
    }

    @Schedules(value = {@Scheduled(cron = "0 04 23 * * ? "), @Scheduled(cron = "0 05 23 * * ? ")})
//    @Scheduled(cron = "0 01 23 * * ? ")
//    @Scheduled(cron = "0 02 23 * * ? ")
    public void test5() {
        System.out.println("当前时间:" + LocalTime.now() + "------test5被调度");
    }
}

@Schedules

上面的测试类中,还使用了@Schedules这样的注解,这个注解只有一个value属性,接收一个@Scheduled数组作为参数,我想应该可以猜到它的作用了吧,那它是干嘛的呢?其实也就是对于一个任务,可能有不同的执行需求,比如:同一天中,不同时间段的执行频率不一样,那么我们可以使用它。
在它的注释中还提到,@Scheduled注解也可以多个一起用,测试类中注释部分和上面@Schedules作用一样

测试

这里5个test方法打印出的结果为:

当前时间:23:03:40.002------test1被调度
当前时间:23:03:45.003------test1被调度
当前时间:23:03:50.001------test1被调度
当前时间:23:03:55.004------test1被调度
当前时间:23:04:00.003------test1被调度

当前时间:23:03:39.747------test2被调度
当前时间:23:03:44.748------test2被调度
当前时间:23:03:49.747------test2被调度
当前时间:23:03:54.745------test2被调度
当前时间:23:03:59.748------test2被调度

当前时间:23:03:39.747------test3被调度
当前时间:23:03:44.748------test3被调度
当前时间:23:03:49.748------test3被调度
当前时间:23:03:54.749------test3被调度
当前时间:23:03:59.750------test3被调度

当前时间:23:03:41.744------test4被调度
当前时间:23:03:46.744------test4被调度
当前时间:23:03:51.748------test4被调度
当前时间:23:03:56.752------test4被调度
当前时间:23:04:01.756------test4被调度

当前时间:23:04:00.004------test5被调度
当前时间:23:05:00.005------test5被调度

可以看到@Schedules的注解确实执行了两次

代码

代码