今天分析 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、看到此代碼,拿着改改就可以直接使用了,非常友善,後期有時間我們分析一下其源碼,敬請期待!