Spring Boot之定时调度Scheduled Tasks

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/xufei_0320/article/details/78348278

平常项目中经常可能会有一些定时调度的需求,就会需要用到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的注解确实执行了两次

代码

代码

猜你喜欢

转载自blog.csdn.net/xufei_0320/article/details/78348278
今日推荐