1.首先加上配置文件(使用ConfigurationProperties)
ConfigurationProperties可实现自动获取最新的配置
@Component
@Data
@ConfigurationProperties(prefix = "scheduletask")
public class ScheduledProperties{
@Value("${taskSwitch:1}")
private Integer taskSwitch;
@Value("${taskCronTrigger:0/10 * * * * ?}")
private String taskCronTrigger;
}
2.定时任务实现类
@Component
@Slf4j
public class ScheduledTask implements InitializingBean {
private static ScheduledFuture<?> future = null;
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Autowired
private ScheduledProperties scheduledProperties;
//监听定时任务的配置是否发生修改
@EventListener
public void envChangeListener(EnvironmentChangeEvent event) {
Set<String> keys = event.getKeys();
if(CollectionUtils.isNotEmpty(keys)){
//判断是否修改了定时任务的配置
boolean flag = keys.stream().anyMatch(x -> x.startsWith("scheduletask"));
if(flag){
log.info("定时任务配置发生改变");
//若已存在该定时任务,则停止重新创建
if(Objects.nonNull(future)){
future.cancel(true);
}
this.syncExec();
}
}
}
//创建定时任务
public void syncExec() {
if(Objects.equals(scheduledProperties.getTaskSwitch(),1)){
future = threadPoolTaskScheduler.schedule(() -> {
try {
//此处执行定时执行的程序
} catch (Exception e) {
log.error("定时任务执行异常:", e);
} finally {
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
String cron = scheduledProperties.getTaskCronTrigger();
if(StringUtils.isEmpty(cron)){
cron = "0/10 * * * * ?"; //默认配置:每10秒执行一次
}
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
});
} else {
if(Objects.nonNull(future)){
future.cancel(true);
}
}
}
/**
* 对象初始化完成后执行
*/
@Override
public void afterPropertiesSet() throws Exception {
this.syncExec();
}