在进行SpringBoot的定时任务使用介绍之前,我觉得有必要向大家说明一下实现定时任务的几种方式。
如果你不想了解其他方式,可跳过第一节。
一、定时任务的几种实现方式
在JAVA开发领域,目前可以通过以下几种方式进行定时任务:
(注:因为这篇文章主要介绍在SpringBoot中使用定时任务,所以其他实现方式这里只做简单记录,有兴趣的可以去深入了解)
1、Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。
2、ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。
3、Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用简单且功能强大。
4、Quartz:一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度,就是配置稍显复杂。
二、SpringBoot中定时任务使用
1、引入依赖
只需要引入spring-boot-starter依赖就可以。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
2、 开启定时任务
在启动类上面加上@EnableScheduling
注解
即可开启定时任务。
@SpringBootApplication
@EnableScheduling
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class);
}
}
3、创建定时任务类
创建一个定时任务类,在方法上加上@Scheduled注解,注解的参数可以配置时间。注意不要忘记加上@Component。
@Component
public class MyTask {
@Scheduled(fixedRate = 5000)
public void testTaskFirst() {
System.out.println("定时任务一:每五秒执行一次,当前时间:"+ LocalTime.now());
}
@Scheduled(cron = "0 28 03 ? * *")
public void testTaskSecond() {
System.out.println("定时任务二:指定每天3:26执行,当前时间:"+LocalTime.now());
}
}
测试结果:
我们可以清楚的看到两个定时任务分别都已经执行。
三、@Scheduled注解参数说明
1、参数说明:
@Scheduled
参数可以接受两种定时的设置,一种是我们常用的cron="*/5 * * * * ?"
,一种是 fixedRate = 5000
,两种都表示每隔五秒打印一下内容。
fixedRate 说明:
@Scheduled(fixedRate = 5000)
:上一次开始执行时间点之后5秒再执行。@Scheduled(fixedDelay = 5000)
:上一次执行完毕时间点之后5秒再执行。@Scheduled(initialDelay=1000, fixedRate=5000)
:第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次。
四、Cron表达式与生成工具
Cron表达式生成工具地址:http://qqe2.com/cron