spring boot进行定时任务一共有三种方式,第一种也就是最简单的一种:基于注解 (@Scheduled)的方式;第二种:基于接口 (SchedulingConfigurer);第三种:基于注解设定多线程定时任务。
基于注解的方式
首先,打开idea,创建springboot项目,无需引入任何jar,springboot自带定时。
然后,在启动类中用注解@EnableScheduling进行标注,表明此类 存在定时任务。在定时执行的方法之上添加注解@Scheduled()。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@SpringBootApplication
@EnableScheduling//第1步:开启定时任务
public class ScheduleDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleDemoApplication.class, args);
}
@Scheduled(fixedRate = 1000*5)//第2步:设置需要定时执行的任务,每隔5秒执行一次
public void doSomething() {
System.out.println("hello spring 定时器");
}
}
点击启动,即可看到控制台6秒输出一次“hello”。
当然,定时任务也可以放在其他类中。例如创建类Test。
package com.example.test;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @Description
* @ClassName Task1
* @Author User
* @date 2020.06.07 12:24
*/
@Component
public class Test {
@Scheduled()
public void sayWord(cron ="*/6 * * * * ?") {
System.out.println("开启了定时任务");
}
}
@Scheduled除了cron还有三种方式:fixedRate,fixedDelay,initialDelay
cron:表达式可以定制化执行任务,但是执行的方式是与fixedDelay相近的,也是会按照上一次方法结束时间开始算起。
*建议:直接点击在线Cron表达式生成器生成参数比较方便*
fixedRate:控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。
fixedRate:是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。
initialDelay:initialDelay = 10000 表示在容器启动后,延迟10秒后再执行一次定时器。