动态
注意点
- 在启动类必须加上@EnableScheduling
- 实现SchedulingConfigurer并重写configureTasks方法
- 动态获取定时任务的执行时间 用的是ScheduledTaskRegistrar的addTriggerTask方法,
- 如果使用静态定时任务可以换用基于注解@Scheduled的方法 或者用ScheduledTaskRegistrar的addCronTask方法
代码
@Component
public class ResolveOrdsTask extends BaseService implements SchedulingConfigurer {
@Autowired
private TimingService timingService;
@Autowired
private TaskLogRepository taskLogRepository;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
QComTaskEntity qComTaskEntity = QComTaskEntity.comTaskEntity;
/**
* 定时任务的具体业务
*/
scheduledTaskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
() -> {
//具体的业务处理
//记录日志
TaskLogEntity taskLogEntity = null;
try {
String noActiveFlag = queryFactory.select(qComTaskEntity.noActiveFlag)
.from(qComTaskEntity)
.where(qComTaskEntity.taskCode.eq(TaskCode.TASK_RESOLVEORDS)).fetchFirst();
if (!"Y".equals(noActiveFlag)) {//如果不是"不可用状态" 处理具体业务逻辑
RespResult<List<Long>> result =xxxService.xxx();//具体业务
//日志
taskLogEntity = new TaskLogEntity( );
} else {
taskLogEntity = new TaskLogEntity();
}
} catch (Exception e) {
taskLogEntity = new TaskLogEntity( );
} finally {
if (taskLogEntity != null) {
//保存日志
taskLogRepository.save(taskLogEntity);
}
}
},
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库获取执行周期
String cron = queryFactory.select(qComTaskEntity.runTime)
.from(qComTaskEntity)
.where(qComTaskEntity.taskCode.eq(TaskCode.TASK_RESOLVEORDS)).fetchFirst();
// String cron = cronMapper.getCron();
//2.2 合法性校验.
if (StringUtils.isEmpty(cron)) {
//日志
TaskLogEntity taskLogEntity1 = new TaskLogEntity();
taskLogRepository.save(taskLogEntity1);
return null;
}
//2.3 返回执行周期(Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}