Spring Boot 定时任务

wiki

1. 声明

在主启动类上加上 @EnableScheduling 注解,并编写定时任务执行的业务方法

1. 简单固定时间

直接使用固定写死时间的 @Scheduled 注解,有3种方式:

  • cron: 固定时间进行处理,执行时间超过间隔时间,会跳过这次任务
  • fixedRate/fixedRateString: 单位毫秒,任务执行间隔是两次任务是开始点,如果执行时长超过间隔,那么会在任务执行结束后立刻执行下一次
  • fixedDelay/fixedDelayString: 单位毫秒,任务执行间隔是前次任务结束和下次任务开始点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 定时任务 静态定时任务
*
* 第一位,表示秒,取值0-59
* 第二位,表示分,取值0-59
* 第三位,表示小时,取值0-23
* 第四位,日期天/日,取值1-31
* 第五位,日期月份,取值1-12
* 第六位,星期,取值1-7,1表示星期天,2表示星期一
* 第七位,年份,可以留空,取值1970-2099
*
*/
@Component
public class SchedulingTaskBasic {

// 每五秒执行一次
@Scheduled(cron = "*/5 * * * * ?")
private void printNowDate() {
System.out.println("简单固定定时任务执行 : "+System.currentTimeMillis());
}
}

可以使用占位符在配置文件中声明

1
@Scheduled(fixedDelayString = "${time.fixedDelay}")

2. 动态定时任务

实现 SchedulingConfigurerconfigureTasks 方法,此方法的作用就是根据给定的 ScheduledTaskRegistrar 注册 TaskScheduler 和特定的任务实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Component
public class CompleteScheduleConfig implements SchedulingConfigurer {

@Autowired
CronMapper cronMapper;

//执行定时任务
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
() -> System.out.println("动态定时任务: " + LocalDateTime.now().toLocalTime()),
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库或者缓存中获取执行周期
String cron = ...;
//2.2 合法性校验.
if (cron!=null) {...}
//2.3 返回执行周期(Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}