本文介绍基于SchedulingConfigurer实现定时任务实时配置cron表达式和开关
- 第一步:重写SchedulingConfigurer配置类的configureTasks()方
@Slf4j
@Configuration
public class MyScheduleConfig implements SchedulingConfigurer {
@Autowired
private TaskService taskService;
@Resource
private SysConfigDao sysConfigDao;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(()->{
log.info("【定时任务】任务开始执行");
String status = sysConfigDao.getValueByKey(ScheduleConstant.STATUS_KEY);
log.info("【定时任务】开关配置:{}", status);
if(StringUtils.isEmpty(status)){
log.info("【定时任务】缺少开关配置,将使用默认配置:on");
status = ScheduleConstant.DEFAULT_STATUS;
}
if("on".equals(status)){
// 执行业务
taskService.doTask();
}
}, triggerContext -> {
String cron = sysConfigDao.getValueByKey(ScheduleConstant.CRON_KEY);
log.info("【定时任务】cron配置:{}", cron);
if(StringUtils.isEmpty(cron)){
log.info("【定时任务】缺少cron配置,将使用默认配置,每10秒执行一次");
cron = ScheduleConstant.DEFAULT_CRON;
}
return new CronTrigger(cron).nextExecutionTime(triggerContext);
});
}
}
2、第二步: 编写控制器类代码
@RestController
public class ScheduleController {
@Resource
private SysConfigDao sysConfigDao;
/**
* 获取配置信息
* @return
*/
@GetMapping("config")
public Map<String, String> config(){
String cron = sysConfigDao.getValueByKey(ScheduleConstant.CRON_KEY);
String status = sysConfigDao.getValueByKey(ScheduleConstant.STATUS_KEY);
Map<String, String> result = new HashMap<>();
result.put("cron", cron);
result.put("status", status);
return result;
}
/**
* 修改表达式
* @param cron
* @return
*/
@PutMapping("cron")
public boolean cron(@RequestParam(value = "cron", required = true) String cron){
// TODO cron表达式做格式校验
return sysConfigDao.updateValueByKey(ScheduleConstant.CRON_KEY, cron) > 0;
}
/**
* 修改开关状态
* @param status
* @return
*/
@PutMapping("status")
public boolean status(@RequestParam(value = "status", required = true)String status){
// TODO status做格式校验
return sysConfigDao.updateValueByKey(ScheduleConstant.STATUS_KEY, status) > 0;
}
}