SpringBoot基于数据库的定时任务统一管理的实现

  import lombok.Data;

  import lombok.extern.slf4j.Slf4j;

  import org.springframework.context.annotation.Configuration;

  import org.springframework.scheduling.annotation.EnableScheduling;

  import org.springframework.scheduling.annotation.SchedulingConfigurer;

  import org.springframework.scheduling.config.CronTask;

  import org.springframework.scheduling.config.ScheduledTask;

  import org.springframework.scheduling.config.ScheduledTaskRegistrar;

  import java.lang.reflect.Method;

  import java.util.ArrayList;

  import java.util.List;

  /**

  * @author Created by niugang on 2019/12/24/15:19

  */

  @Configuration

  @EnableScheduling

  @Slf4j

  public class CompleteScheduleConfig implements SchedulingConfigurer {

  private static List taskRecordList = new ArrayList<>();

  /*

  *模拟数据库存储

  */

  static {

  TaskRecord taskRecord = new TaskRecord();

  taskRecord.setExecuteMehod("task1");

  taskRecord.setClassPath("com.example.demo.pojo.TaskTest");

  taskRecord.setCron("0/5 * * * * ?");

  taskRecordList.add(taskRecord);

  TaskRecord taskRecord2 = new TaskRecord();

  taskRecord2.setExecuteMehod("task2");

  taskRecord2.setClassPath("com.example.demo.pojo.TaskTest2");

  taskRecord2.setCron("0/10 * * * * ?");

  taskRecordList.add(taskRecord2);

  }

  @Override

  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

  // taskRegistrar.addCronTask(() -> log.info("执行定时任务,{}", LocalDateTime.now()), "0/5 * * * * ?");

  /* taskRegistrar.addCronTask(new Runnable() {

  @Override

  public void run() {

  try {

  Class<?> aClass = Class.forName("com.example.demo.pojo.TaskTest");

  Object o = aClass.newInstance();

  Method[] declaredMethods = aClass.getDeclaredMethods();

  for (Method declaredMethod : declaredMethods) {

  declaredMethod.invoke(o);

  // log.info("方法名称:{}",declaredMethod.getName());

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }, "0/5 * * * * ?");*/

  for (TaskRecord taskRecord : taskRecordList) {

  String classPath = taskRecord.getClassPath();

  String cron = taskRecord.getCron();

  String executeMehod = taskRecord.getExecuteMehod();

  Runnable runnable = () -> {

  Class<?> aClass;

  try {

  aClass = Class.forName(classPath);

  Object o = aClass.newInstance();

  Method[] declaredMethods = aClass.getDeclaredMethods();

  for (Method declaredMethod : declaredMethods) {

  if (declaredMethod.getName().equals(executeMehod)) {

  /// log.info("方法名称:{}",declaredMethod.getName());

  declaredMethod.invoke(o);

  }

  }

  } catch (Exception e1) {

  e1.printStackTrace();

  }

  };

  CronTask cronTask = new CronTask(runnable, cron);

  ScheduledTask scheduledTask = taskRegistrar.scheduleCronTask(cronTask);

  //scheduledTask.cancel(); 取消定时任务

  }

  }

  @Data

  private static class TaskRecord {

  private String classPath;

  private String executeMehod;

  private String cron;

  //可以在增加一个type 执行其他类型的定时任务

  }

  }