SpringBoot简单定时任务@Schedule

在平时工作中,定时任务可能比较常见,SpringBoot自带有一个简单的定时任务功能,有多简单呢?只需要2步就可以完成。

第一步

在springboot入口类,即XXXApplication.java中,增加@EnableScheduling注解,表示启用定时任务。

第二步

在任意bean中,给需要定时执行的方法增加@Scheduled注解。

还是看一个基本的代码吧:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class DemoApplication {

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

}
package com.example.demo;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Task {

    @Scheduled(fixedDelay = 1000 * 10)
    public void say() {
        System.out.println("doing...");
    }

}

对于第一步,整个SpringBoot项目,只要有一个bean添加了@EnableScheduling注解,那么所有的@Scheduled都会生效,所以一般我们都加在XXXApplication.java中。如果要在家Task类上,也是可以的。

第二步才是要讲的重点。定时任务调度有3种方法。

固定延时任务

    @Scheduled(fixedDelay = 1000 * 10)
    public void say() {
        System.out.println("doing...");
    }

顾名思义,两次方法执行中间是固定的间隔时间。
比如,我们定时10秒一次,定时任务的方法每次需要2秒钟才能执行完成。
服务器启动,第一次执行是在第0秒,第2秒后执行完成;第二次执行是在第12秒,第14秒后执行完成;第三次执行是在第24秒…

固定频率任务

    @Scheduled(fixedRate = 1000 * 10)
    public void say() {
        System.out.println("doing...");
    }

执行任务的频率是固定的。
比如,我们定时10秒一次,定时任务的方法每次需要2秒钟才能执行完成。
第一次执行是在第0秒,第2秒后执行完成;第二次执行是第10秒,第12秒执行完成;第三次是在第20秒…
那么问题来了,如果我们定时10秒一次,而这个方法因为网络原因,花了15秒才执行完成,怎么办呢?
下一个任务会在该次任务完成后,马上执行。

Cron表达式

    @Scheduled(cron = "0/10 * * * * *")
    public void say() {
        System.out.println("doing...");
    }

Cron表达式很经典了,可以很灵活的控制任务执行的时间,比如几点几分几秒执行等等,网上很多资料,这里就不详细讲解了。

优缺点

优点很明显,就是简单,而且满足大部分情况。
缺点是所有的执行时间都是固定死的,创建了定时任务就不能取消或修改。
而我在工作中就遇到了需要修改或取消定时任务的需求,对于这种情况,我们可以使用Quartz来完成,并且可以实现持久化定时任务,之后我会详细记录一下Quartz的使用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据