背景

Spring 中,创建定时任务除了使用@Scheduled 注解外,还可以使用 SchedulingConfigurer。

@Scheduled 注解有一个缺点,其定时的时间不能动态的改变,而基于 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以实现在@Configuration 类上,同时不要忘了,还需要@EnableScheduling 注解的支持。

基于@Scheduled注解的实现方式

代码示例

1
2
3
4
5
6
7
8
@Component
@EnableScheduling
public class TimeScheduled {
@Scheduled(cron = "${scheduled.cron}")
public void run() {
//业务逻辑
}
}

基于实现SchedulingConfigurer的实现方式

在启动类必须加上@EnableScheduling 开启定时任务

实现SchedulingConfigurer并重写configureTasks方法

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
@Data
public class TimeSchedulingConfigurer implements SchedulingConfigurer{
private String cron = "* 0/1 * * * ?"; //调用set方法可动态设置时间规则
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addCronTask(new Runnable() {
@Override
public void run() {
//业务逻辑
}
}, cron); //加入时间
}
}

设置项目启动后,初始化 定时任务执行时间

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
@Order(value = 1) //value值会 从小至大的执行
public class TimeStartController implements ApplicationRunner {

@Autowired
private TimeSchedulingConfigurer job; //得到定时任务

@Override
public void run(ApplicationArguments args) throws Exception {
job.setCron("* 0/5 * * * ?"); //根据需求重新赋值时间规则
}

}

作者简介

雷先森o