第一步:要在启动类上添加注解@EnableScheduling开启定时任务
@EnableScheduling
@SpringBootApplication
public class FirstApplication {
private static Logger log = LoggerFactory.getLogger(FirstApplication.class);
public static void main(String[] args) {
SpringApplication.run(FirstApplication.class, args);
}
}
第二步:创建定时任务类,交给spring管理
package com.springboot.first.task;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class TaskTest {
@Scheduled(cron = "0/10 * * * * ?")
public void task1(){
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date())+"------------task1---10秒执行一次");
}
@Scheduled(cron = "0/5 * * * * ?")
public void task2(){
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date())+"------------task2---5秒执行一次");
}
}
第三步:设置执行时间@Scheduled(cron="0/10 * * * * ?"),cron表达式设置规则如下:
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
, 表达一个列表值,如在星期字段中使用 1,2,4 ,则表示星期天,星期一,星期三
- 区间 表示一个区间范围
* 通配符
? 你不想设置那个字段,目前只能出现在日期和星期这两个位置
/ 如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/10就是,从0秒开始,每10秒
# #号只能出现在星期的位置,例如:(0 10 3 ? * 1#3 ) 每个月的第三个星期的星期天的3点10分执行
除了通过cron表达式设置时间,还有以下几种:
@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行(不在乎执行了多长时间,每五秒执行一次)
@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
运行结果: