在已经上线的项目中,定时任务是必不可少的。基于spring boot自动装配的原理,我们要集成task定时任务还是非常简单的。只需要简单的两步就可以实现。
1、创建一个spring boot项目,并在项目的启动类(也不一定非要是启动类,只要@Configuration注解标识过的配置类就行)上加@EnableScheduling注解。这个注解用于开启定时任务的支持
@SpringBootApplication
@EnableScheduling
public class Springjdk21TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springjdk21TestApplication.class, args);
}
}
2、直接在项目中使用定时任务即可。
创建一个bean。在这个bean中创建想要定时执行的方法,并在这个方法上加入@Scheduled注解即可。
@Component
public class TestTask {
/**
* 定时任务,每隔5秒执行一次
*/
@Scheduled(fixedRate = 5000)
public void sayHello() {
System.out.println("say hello========>"+
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
fixedRate表示从启动项目开始,每个多少毫秒执行一次。
现在启动我们的主类,可以看到定时任务已经执行;
可以看到,每个5秒钟,控制台输出了一次打印语句。
当然,使用fixedRate参数只能实现简单的定时任务,假如我们的定时任务比较复杂呢。比如,我们要自定义任务的开始时间和执行间隔,这时fixedRate已经不能满足我们的需求了,我们需要使用另一种方法,cron表达式。
cron表达式是一种用于配置定时任务(计划任务)执行时间的字符串表达式
一个cron表达式由6或7个字段组成,分别表示如下时间单位:
- 秒(Seconds) -
0 - 59
- 分(Minutes) -
0 - 59
- 小时(Hours) -
0 - 23
(24小时制)- 日期(Day of Month) -
1 - 31
- 月份(Month) -
1 - 12
或JAN-DEC
- 星期几(Day of Week) -
0 - 7
或SUN-SAT
(7或0表示星期天)- 年份(Year,可选) -
1970 - 2099
字段之间使用空格分隔,表示时间的顺序。
(在标准的cron表达式中,通常是6个字段,不包括年份。但是,有些系统和应用允许扩展cron表达式到7个字段,加入年份字段。(7个字段)可能不被所有cron作业调度器支持,特别是在一些Unix/Linux系统中。在Java的Spring框架中,如果你使用@Scheduled
注解,通常不需要指定年份,因为Spring的调度器默认不会扩展到7个字段。)
当然,现在的spring boot的高版本也不支持cron的7个参数了。cron表达式的设计初衷是为了在操作系统层面设置周期性的计划任务,而不是用来安排一次性的特定日期和时间。如果你需要在特定年份执行任务,你应该使用应用程序逻辑来处理年份,或者选择一个不同的调度方法来处理跨年度的任务。
特殊字符:
*
:代表所有可能的值。例如,在分钟字段中使用*
,表示每分钟。?
:表示不指定值。只能在日期和星期几字段中使用。-
:表示一个范围。例如,10-12
小时 表示从上午10点到12点。/
:表示起始时间开始,每隔一定的间隔执行。例如,在分钟字段中使用0/30
,表示每30分钟。L
:表示“Last”,只能用于日期和星期几字段。例如,在日期字段使用L
,表示月份的最后一天。W
:表示有效工作日(周一到周五),不能和L
一起使用,只能用于日期字段。#
:表示星期几的第几个周。例如,6#3
表示某月的第三个星期天。
一般,我们只需要知道cron表达式对应的含义就行,不需要我们自己进行编写。使用到的时候直接在往上搜一个在线的生成网址即可。
cron的在线生成网址:在线Cron表达式生成器 (qqe2.com)
我们需要的时候,直接使用图形化的界面点击生成相应的cron表示式即可。
* * 12 1 * ?
这个cron是我使用网址生成的,表示每个月1号的中午12点执行一次。
@Component
public class TestTask {
/**
* 定时任务,每隔5秒执行一次
*/
@Scheduled(cron = "* * 12 1 * ?")
public void sayHello() {
System.out.println("say hello========>"+
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
由于spring boot的自动装配,官方已经帮我们做了很多工作。我们只需要安装官方的约定,简单的做一些配置就可以轻松的实现绝大多数功能。