1.定时任务实体类
/**
* 任务名称
*/
@TableField("task_name")
private String taskName;
/**
* cron表达式
*/
@TableField("task_cron")
private String taskCron;
/**
* 0下线 1上线
*/
@TableField("status")
private String status;
/**
* 更新时间
*/
@TableField("loaddate")
private String loaddate;
2. 定时任务列表类
public class TaskScheduleMethods {
public void task1(TTaskSchedule taskSchedule) {
log.info(taskSchedule.getTaskName() + " ---------- 任务执行!");
}
public void task2(TTaskSchedule taskSchedule) {
log.info(taskSchedule.getTaskName() + " ---------- 任务执行!");
}
public void task3(TTaskSchedule taskSchedule) {
log.info(taskSchedule.getTaskName() + " ---------- 任务执行!");
}
public void task4(TTaskSchedule taskSchedule) {
log.info(taskSchedule.getTaskName() + " ---------- 任务执行!");
}
public void task5(TTaskSchedule taskSchedule) {
log.info(taskSchedule.getTaskName() + " ---------- 任务执行!");
}
}
3. 映射处理类
public class TaskScheduleHandler implements Runnable {
private TTaskSchedule taskSchedule;
private TaskScheduleMethods methods;
public TaskScheduleHandler(TTaskSchedule taskSchedule, TaskScheduleMethods methods) {
this.taskSchedule = taskSchedule;
this.methods = methods;
}
@Override
public void run() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
try {
Class<? extends TaskScheduleMethods> aClass = methods.getClass();
Method method = aClass.getMethod(taskSchedule.getTaskName(), TTaskSchedule.class);
method.invoke(aClass.newInstance(), taskSchedule);
} catch (Exception e) {
e.printStackTrace();
}
stopWatch.stop();
}
}
4. 项目启动扫描状态为启动的定时任务
@Configuration
@Slf4j
public class TaskAutoLoad implements InitializingBean {
@Autowired
@Lazy
private TTaskScheduleMapper taskScheduleMapper;
@Autowired
@Lazy
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Autowired
@Lazy
private TaskScheduleServiceImpl taskScheduleService;
public static ConcurrentHashMap<String, ScheduledFuture> futureConcurrentHashMap = new ConcurrentHashMap<>();
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
return threadPoolTaskScheduler;
}
@Override
public void afterPropertiesSet(){
LambdaQueryWrapper<TTaskSchedule> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TTaskSchedule::getStatus, "1");
List<TTaskSchedule> tTaskSchedules = taskScheduleMapper.selectList(wrapper);
for (TTaskSchedule tTaskSchedule : tTaskSchedules) {
String taskName = tTaskSchedule.getTaskName();
ScheduledFuture<?> schedule = null;
try {
schedule = threadPoolTaskScheduler.schedule(new TaskScheduleHandler(tTaskSchedule, new TaskScheduleMethods()), new CronTrigger(tTaskSchedule.getTaskCron()));
} catch (Exception e) {
log.error(taskName+" - "+tTaskSchedule.getTaskCron()+" Cron表达式错误");
taskScheduleService.taskError(tTaskSchedule);
continue;
}
futureConcurrentHashMap.put(tTaskSchedule.getTaskName(), schedule);
log.info(tTaskSchedule.getTaskName() + " ---------- 定时任务初始化启动!");
}
}
}