今天分析 spring 动态传参数的定时任务,以往定时任务都是执行时间不能改变,写死的,今天我们分析动态的传参方案:
1、启动类配置:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
//定时任务 的注解,必须加上
@EnableScheduling
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
1、实现的业务代码:
/**
* @author wanghuainan
* @date 2021/1/27 19:18
*必须实现 SchedulingConfigurer 接口的方法。@Configuration注解必须加上,以供启动时扫描此类
*/
@Configuration
public class BackupDataTask implements SchedulingConfigurer {
//下面几个是spring 依赖注入的类
@Autowired
BackupService BackupService;
@Autowired
RedisUtil redisUtil;
@Autowired
BackupMapper BackupMapper;
@Autowired
ScheduleTaskMapper scheduleTaskMapper;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
try {
ScheduleTask scheduleTask = scheduleTaskMapper.selectByRowId(Constant.SCHEDULE_BACKUP_LAYER_FLAG);
DataBackupModel dataBackupModel = new DataBackupModel();
BeanUtils.copyProperties(scheduleTask,dataBackupModel);
BackupService.createDateBackup(dataBackupModel); //异步定时操作,即定时任务的业务代码
} catch (Exception e) {
e.printStackTrace();
}
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// String cron =cronMapper.getCron();
// redisUtil.getString("")
String cron = null;
//这里去数据库取定时的时间,下次执行时就生效
ScheduleTask scheduleTask = scheduleTaskMapper.selectByRowId("adasdad");
if(Objects.nonNull(scheduleTask)){
cron = scheduleTask.getCronDate();
}
// String cron="0 0/1 * * * ? ";
if("".equals(cron)||cron==null)
return null;
//定时任务触发,可修改定时任务的执行周期
CronTrigger trigger=new CronTrigger(cron);
Date nextExecDate= trigger.nextExecutionTime(triggerContext);
return nextExecDate;
}
});
}
}
3、lambda表达式 风格代码
/**
* lambda表达式 代码风格
* @param taskRegistrar
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
() -> {
System.out.println("执行动态定时任务: ";
//定时任务业务代码
},
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库获取执行周期
String cron = "";
System.out.println("cron="+cron);
//2.2 合法性校验.
if (StringUtils.isEmpty(cron)) {
// Omitted Code ..
return null;
}
//2.3 返回执行周期(Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
2、看到此代码,拿着改改就可以直接使用了,非常方便,后期有时间我们分析一下其源码,敬请期待!