1、概念
定时任务就是在指定的时间点,自动执行指定的任务。或者在指定的时间间隔,自动进行任务的执行。如:每天中午两点一次等。而在schedule中,这个时间是由cron表达式来决定的。
cron表达式如下:
由六个字段组成,分别代表:
秒、分钟、小时、天、月和星期
0 0 8 * * * //表示每天上午8点执行任务
0 0/30 9-17 * * * //表示在每天9点到17点之间,每隔30分钟执行一次任务
2、 静态定时任务
所谓静态就是指代码中定好任务的执行周期及任务,启动后不能进行动态更改。
@Component — 注入spring容器
@Scheduled(finxedRate = “”) — 在方法上开启定时任务,finxedRate代表执行间隔(ms),也可加入正则表达式@Scheduled(cron = “”)
@EnableScheduling — springboot启动类上添加,开启定时任务
启动类:
@SpringBootApplication
@EnableScheduling
public class AppTest {
public static void main(String[] args) {
SpringApplication.run(AppTest.class,args);
}
}
定时任务
@Component
public class ScheduleTest {
@Scheduled(cron = "0/5 * * * * *")
public void crontest(){
System.out.println("1111");
}
}
项目启动后任务会自动执行
3、动态定时任务
SchedulingConfigurer — 继承并配置定时任务
@EnableScheduling — 开启
@Configuration — 说明配置类
动态定时任务在项目启动后,可以随时进行任务的添加和卸载。方便任务执行和停止。具体如下:
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
private ScheduledTaskRegistrar taskRegistrar;
//存储任务实例,用于保存任务实例
private Map<String,CronTask> taskMap = new HashMap<>();
//用于保存进程实例,对其进行操作
private Map<String,ScheduledFuture> futureMap = new HashMap<>();
//初始化时加载
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
this.taskRegistrar = taskRegistrar;
}
//添加任务,并执行,把执行实例放到future中方便控制
public void addTask(String key, CronTask task){
if(taskMap.containsKey(key)){
return;
}
taskRegistrar.addTriggerTask(task);
taskMap.put(key,task);
TaskScheduler scheduler = taskRegistrar.getScheduler();
ScheduledFuture<?> schedule = scheduler.schedule(task.getRunnable(), task.getTrigger());
futureMap.put(key,schedule);
}
public void removeTask(String key){
if(!taskMap.containsKey(key)){
return;
}
taskRegistrar.getCronTaskList().remove(taskMap.get(key));
taskMap.remove(key);
//停止执行中的任务
futureMap.get(key).cancel(true);
futureMap.remove(key);
}
}