1.使用步骤
- 在启动类上加上@EnableScheduling注解,表示开启定时任务
- 在任务类上加上@Scheduled()注解,并设置参数,参数配置如下
配置项 | 类型 | 详细描述 |
---|---|---|
cron | String | 使用表达式的方式定义任务执行时间 |
zone | String | 设定区域时间 |
fixedDelay | long | 从上一个任务完成开始到下一个任务开始的间隔,单位为毫秒 |
fixedDelayString | String | 与 fixedDelay相同只是使用字符串,这样可以使用SpEL来引入配置文件的配置 |
initialDelay | long | 在SpringloC容器完成初始化后,首次任务执行延迟时间,单位为毫秒 |
initialDelayString | String | 与initialDelay相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置 |
fixedRate | long | 从上一个任务开始到下一个任务开始的间隔,单位为毫秒 |
fixedRateString | String | 与fixedRate相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置 |
ps:注意 fixedDelay 和 fixedRate 的区别
关于cron 表达式可自行百度,可根据需要在线生成
测试:
/**** imports ****/
@Service
public class ScheduleServiceImpl {
// 计数器
int count1 = 1;
int count2 = 1;
// 每隔1秒执行一次
@Scheduled(fixedRate = 1000)
public void task1() {
System.out.println("【" +Thread.currentThread().getName()+"】"
+ "【task1】每秒钟执行一次,执行第【" + count1 + "】次");
count1 ++;
}
@Scheduled(fixedRate = 1000)
public void task2() throws Exception{
System.out.println("【" +Thread.currentThread().getName()+"】"
+ "【task2】每秒钟执行一次,执行第【" + count2 + "】次");
count2 ++;
}
}
输出:
【scheduling-1】【task2】每秒钟执行一次,执行第【1】次
【scheduling-1】【task1】每秒钟执行一次,执行第【1】次
【scheduling-1】【task2】每秒钟执行一次,执行第【2】次
【scheduling-1】【task1】每秒钟执行一次,执行第【2】次
【scheduling-1】【task2】每秒钟执行一次,执行第【3】次
【scheduling-1】【task1】每秒钟执行一次,执行第【3】次
......
读取配置文件中cron表达式
@Scheduled(cron = "${TimePointTask01}")
public void startFirstTask() {
System.out.println("定时任务执行");
}
yml配置
#每分钟一次
TimePointTask01: 0 0/1 * * * ?
2.配置异步定时任务
步骤
- 在启动类上补充@EnableAsync注解,作用:开启 Spring 异步方法执行功能
- 在任务方法或类上加上@Async注解,作用:该方法或类需要异步线程执行。加在类上指该类所有方法都需要异步执行,加在方法上指方法需要异步执行。
注意:@EnableAsync和@Async两个注解缺一不可。
@Service
public class ScheduleServiceImpl {
// 计数器
int count1 = 1;
int count2 = 1;
// 每隔1秒执行一次
@Scheduled(fixedRate = 1000)
// 使用异步执行
@Async
public void task1() {
System.out.println("【" +Thread.currentThread().getName()+"】"
+ "【task1】每秒钟执行一次,执行第【" + count1 + "】次");
count1 ++;
}
@Scheduled(fixedRate = 1000)
@Async
public void task2() throws Exception{
System.out.println("【" +Thread.currentThread().getName()+"】"
+ "【task2】每秒钟执行一次,执行第【" + count2 + "】次");
count2 ++;
}
}
结果:
从输出结果可以看出线程名称是不一样的。
【task-1】【task2】每秒钟执行一次,执行第【1】次
【task-2】【task1】每秒钟执行一次,执行第【1】次
【task-3】【task2】每秒钟执行一次,执行第【2】次
【task-4】【task1】每秒钟执行一次,执行第【2】次
【task-5】【task2】每秒钟执行一次,执行第【3】次
【task-6】【task1】每秒钟执行一次,执行第【3】次
......