需求:这边负责的有部分报警模块,需要每天定时定点的发送预警信息和短信,但是业务需求不是很明确,开放性平台所以定时任务时间也是不一样的所以频繁的修改需求重复的上下jar包就很繁琐,项目老大就提了一嘴你有时间可以研究下可配置的定时任务,话不多说上代码,技术小白一枚,不对的话多多指教!!!
相对于基于注解的简单定时器任务spring提供了基于SchedulingConfigurer接口开发的动态定时器任务话不多说上代码;
@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//Lambda表达式无参写法 ()->{}
() ->{
执行的的代码逻辑
},
//Lambda表达式单个参数写法 (T t)->{} 单个参数参数类型可省略 t ->{}
triggerContext -> {
QueryWrapper<Cron> wrapper = new QueryWrapper<Cron>().eq("method_name", "overspeed");
String cron = cronService.getOne(wrapper).getCron();
return new CronTrigger(cron).nextExecutionTime(triggerContext);
});
}
代码很简单不过有兴趣的话可以看我下面的解释(能力可能不是很够不喜勿喷)
基于接口开发那么我们肯定要了解接口有哪些方法
接口方法只有一个
package org.springframework.scheduling.annotation;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@FunctionalInterface
public interface SchedulingConfigurer {
//配置任务
void configureTasks(ScheduledTaskRegistrar var1);
//ScheduledTaskRegistrar定时任务注册器(画重点)
}
这里面最重要的就是ScheduledTaskRegistrar 我们看这个类有哪些方法
里面的方法很多
addTriggerTask //添加触发任务
addCronTasK 添加Cron定时任务
还有添加多个任务我这里用到的是第一个
添加触发任务这里说到触发任务我们要看几个参数
task :要执行的任务
trigger: 触发器(我们定时任务启动的策略都在这里配置)
TriggerContext: 触发器的上下文
那么触发器怎么配置的呢,我们看看注册器怎么添加定时任务看代码
//添加定时任务
public void addTriggerTask(Runnable task, Trigger trigger) {
this.addTriggerTask(new TriggerTask(task, trigger));
}
//新建一个触发任务把任务添加到触发任务集合里面
public void addTriggerTask(TriggerTask task) {
if (this.triggerTasks == null) {
this.triggerTasks = new ArrayList();
}
this.triggerTasks.add(task);
}
//触发定时任务集合
private List<TriggerTask> triggerTasks;
通过上面的封装把我们的任务添加到任务注册里面;
任务有了我们定时策略和定时时间怎么拿到
这里就是我们的触发器触发器是一个接口我们实现这个接口
triggerContext -> {
QueryWrapper<Cron> wrapper = new QueryWrapper<Cron>().eq("method_name", "overspeed");
String cron = cronService.getOne(wrapper).getCron();
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
//这里实现的cron触发器根据定时任务来的
// cron 从数据库拿到的cron表达式
//nextExecutionTime(triggerContext)通过传入的triggerContext拿到上次执行时间
public Date nextExecutionTime(TriggerContext triggerContext) {
//拿到上次执行时间
Date date = triggerContext.lastCompletionTime();
if (date != null) {
Date scheduled = triggerContext.lastScheduledExecutionTime();
if (scheduled != null && date.before(scheduled)) {
date = scheduled;
}
} else {
date = new Date();
}
return this.sequenceGenerator.next(date);
}
描述能力有限,希望能帮到你