1. 定义scheduled配置类, 实现SchedulingConfigurer接口
package com.metarnet.kpi.scheduled;
import cn.hutool.core.util.ClassLoaderUtil;
import com.metarnet.kpi.dictionary.domian.SysDict;
import com.metarnet.kpi.dictionary.service.SysDictService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.List;
import java.util.Objects;
/**
* @author wangyj
* @className ScheduledConfig
* @description Scheduled定时任务配置类
* @date 21/6/25
*/
@Configuration //1.主要用于标记配置类,兼备Component的效果
@EnableScheduling //2.开启定时任务
@ConditionalOnProperty(prefix = "scheduled", name = "enabled", havingValue = "true")
@Slf4j
public class ScheduledConfig implements SchedulingConfigurer {
@Autowired
private SysDictService sysDictService;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
List<SysDict> jobs = sysDictService.findAllDictByBean(new SysDict.SysDictBuilder().withModuleName("SCHEDULING").withKeyGroup("SCHEDULING_PARAMS").build());
for(SysDict job : jobs){
// 状态为1时有效
if(1 == job.getStatus()){
taskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
Objects.requireNonNull(getTask(job)),
//2.设置执行周期(Trigger)
triggerContext -> {
String cron = job.getValueDesc();
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}
}
private Runnable getTask(SysDict job) {
try {
log.info("Scheduled定时任务配置:{} --> {}: {}",job.getKeyGroupName(),job.getValue(),job.getValueDesc());
Class<?> loadClass = ClassLoaderUtil.loadClass(job.getValue());
return (Runnable) loadClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
2. 定时任务配置表结构(我这儿直接放到字典表里了):
3. 定时任务类实现
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
public class BigDataPostTask implements Runnable{
@Override
public void run() {
System.out.println("定时任务测试: ==============>"+DateUtil.formatTime(new Date()));
}
}
4.定时任务开关(application-scheduled.yml)
scheduled:
enabled: false
做简单的记录 , 有问题或者更好的建议请务必在评论区共同探讨