admin管理员组

文章数量:1794759

Springboot 通过Schedule实现定时任务动态读取执行(从数据库读取)

Springboot 通过Schedule实现定时任务动态读取执行(从数据库读取)

前言:1、利用反射机制实现。

           2、通过实现SchedulingConfigurer来配置定时任务。

           3、此种方式只能实现项目启动时,定时任务执行,不能再项目启动后开启、暂停任务。

效果:

        数据库中配置了2个任务(状态都是开启的,如果不想执行某条任务,可以将状态改为1)

 

表结构:

 
  • CREATE TABLE `Schedule_setting` (

  • `id` int(11) NOT NULL AUTO_INCREMENT,

  • `job_name` varchar(255) DEFAULT NULL,

  • `class_name` varchar(255) DEFAULT NULL,

  • `method` varchar(255) DEFAULT NULL,

  • `cron` varchar(255) DEFAULT NULL,

  • `status` int(2) DEFAULT NULL COMMENT '0 代表开启,1代表关闭',

  • PRIMARY KEY (`id`)

  • ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

  • 项目启动后开启执行,数据库中定义的2个方法

    代码实现:

    任务实体

     
  • /**

  • * @author : 徐长城

  • * @des:

  • * @date : 2019/8/20 21:37

  • */

  • public class ScheduleConfig {

  • private Long id;

  •  
  • private String jobName;

  •  
  • private String className;

  •  
  • private String method;

  •  
  • private String cron;

  •  
  • public Long getId() {

  • return id;

  • }

  •  
  • public void setId(Long id) {

  • this.id = id;

  • }

  •  
  • public String getJobName() {

  • return jobName;

  • }

  •  
  • public void setJobName(String jobName) {

  • this.jobName = jobName;

  • }

  •  
  • public String getClassName() {

  • return className;

  • }

  •  
  • public void setClassName(String className) {

  • this.className = className;

  • }

  •  
  • public String getMethod() {

  • return method;

  • }

  •  
  • public void setMethod(String method) {

  • this.method = method;

  • }

  •  
  • public String getCron() {

  • return cron;

  • }

  •  
  • public void setCron(String cron) {

  • this.cron = cron;

  • }

  • }

  • Dao以及xml

    Springboot获取bean

     
  • /**

  • * @author : 徐长城

  • * @des: 获取bean

  • * @date : 2019/8/20 21:59

  • */

  • @Component

  • public class ApplicationContextHelper implements ApplicationContextAware {

  •  
  • private static ApplicationContext applicationContext;

  •  
  • public ApplicationContextHelper() {

  • }

  •  
  • @Override

  • public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

  • ApplicationContextHelper.applicationContext = applicationContext;

  • }

  •  
  • public static Object getBean(String beanName) {

  • return applicationContext != null?applicationContext.getBean(beanName):null;

  • }

  • }

  • 定时配置

     
  • /**

  • * @author : 徐长城

  • * @des:

  • * @date : 2019/8/20 21:43

  • */

  • @Component

  • public class ScheduleSetting implements SchedulingConfigurer {

  •  
  • @Autowired

  • private ScheduleDao scheduleDao;

  •  
  • @Override

  • public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

  • // 获取所有任务

  • List<ScheduleConfig> scheduleList = scheduleDao.getScheduleList();

  • System.out.println(scheduleList.size());

  • for (ScheduleConfig s : scheduleList){

  • scheduledTaskRegistrar.addTriggerTask(getRunnable(s), getTrigger(s));

  • }

  • }

  •  
  •  
  • /**

  • * 转换首字母小写

  • *

  • * @param str

  • * @return

  • */

  • public static String lowerFirstCapse(String str) {

  • char[] chars = str.toCharArray();

  • chars[0] += 32;

  • return String.valueOf(chars);

  • }

  •  
  • /**

  • * runnable

  • * @param scheduleConfig

  • * @return

  • */

  • private Runnable getRunnable(ScheduleConfig scheduleConfig){

  • return new Runnable() {

  • @Override

  • public void run() {

  • Class<?> clazz;

  • try {

  • clazz = Class.forName(scheduleConfig.getClassName());

  • String className = lowerFirstCapse(clazz.getSimpleName());

  • Object bean = (Object) ApplicationContextHelper.getBean(className);

  • Method method = ReflectionUtils.findMethod(bean.getClass(), scheduleConfig.getMethod());

  • ReflectionUtils.invokeMethod(method, bean);

  • } catch (ClassNotFoundException e) {

  • e.printStackTrace();

  • }

  • }

  • };

  • }

  •  
  • /**

  • * Trigger

  • * @param scheduleConfig

  • * @return

  • */

  • private Trigger getTrigger(ScheduleConfig scheduleConfig){

  • return new Trigger() {

  • @Override

  • public Date nextExecutionTime(TriggerContext triggerContext) {

  • CronTrigger trigger = new CronTrigger(scheduleConfig.getCron());

  • Date nextExec = trigger.nextExecutionTime(triggerContext);

  • return nextExec;

  • }

  • };

  •  
  • }

  • }

  • 启动类中添加@EnableScheduling

    本文标签: 数据库动态SpringBootschedule