SpringBoot动态配置定时任务cron(动态改变执行周期)

package model;

public class SpringScheduledCron {
    private String cronId;
    private String cronKey;
    private String cronExpression;
    private String taskExplain;
    private String status;

    
    
    @Override
    public String toString() {
        return "SpringScheduledCron{" + "cronId=" + cronId + ", cronKey='" + cronKey + '\'' + ", cronExpression='"
                + cronExpression + '\'' + ", taskExplain='" + taskExplain + '\'' + ", status=" + status + '}';
    }

    public String getCronId() {
        return cronId;
    }

    public void setCronId(String cronId) {
        this.cronId = cronId;
    }

    public String getCronKey() {
        return cronKey;
    }

    public void setCronKey(String cronKey) {
        this.cronKey = cronKey;
    }

    public String getCronExpression() {
        return cronExpression;
    }

    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }

    public String getTaskExplain() {
        return taskExplain;
    }

    public void setTaskExplain(String taskExplain) {
        this.taskExplain = taskExplain;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    
    
    public SpringScheduledCron() {
        // TODO Auto-generated constructor stub
    }

    public SpringScheduledCron(String cronId, String cronKey, String cronExpression, String taskExplain,
            String status) {
        this.cronId = cronId;
        this.cronKey = cronKey;
        this.cronExpression = cronExpression;
        this.taskExplain = taskExplain;
        this.status = status;
    }
    
    
    
}
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;


@Component
public class SpringScheduledCronRepository {

    static int i = 0;
    static {
        System.out.println("in=="+(i++));
    }
    
    public SpringScheduledCron findByCronKey(String cronKey) {
        
        SpringScheduledCron cron = null;
        
        List<SpringScheduledCron> list = findAll();
        for (SpringScheduledCron springScheduledCron : list) {
            if(springScheduledCron.getCronKey().equals(cronKey)) {
                cron = springScheduledCron;
            }
        }
        
        return cron;
    };

    public List<SpringScheduledCron> findAll(){
        
        List<SpringScheduledCron> list = new ArrayList<SpringScheduledCron>();
        try {
            
            File cronFile = new File("./config/cron.txt");
            FileReader in = new FileReader(cronFile);
            BufferedReader bufIn = new BufferedReader(in);
            // 替换
            String line = null;
            while ((line = bufIn.readLine()) != null) {
                String[] ls = line.split("\\|");
                if(ls.length == 5) {
                    SpringScheduledCron cron =  new SpringScheduledCron(ls[0],ls[1],ls[2],ls[3],ls[4]);
                    list.add(cron);
                }
            }
            // 关闭 输入流
            bufIn.close();
        } catch (Throwable e) {
            System.out.println(e.getMessage());
        }
        return list;
    };

}
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.context = applicationContext;
    }

    public static <T> T getBean(Class<T> clz) {
        return context.getBean(clz);
    }

    public static Object getBean(String name) {
        return context.getBean(name);
    }

    public ApplicationContext getApplicationContext() {
        return context;
    }

}

  

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.Assert;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@Configuration
public class ScheduledConfig implements SchedulingConfigurer {

    @Autowired
    private ApplicationContext context;
    
    @Autowired
    private SpringScheduledCronRepository cronRepository;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        for (SpringScheduledCron springScheduledCron : cronRepository.findAll()) {
            Class<?> clazz;
            Object task;
            try {
                clazz = Class.forName(springScheduledCron.getCronKey());
                task = context.getBean(clazz);
            } catch (ClassNotFoundException e) {
                throw new IllegalArgumentException("" + springScheduledCron.getCronKey() + "有误", e);
            } catch (BeansException e) {
                throw new IllegalArgumentException(springScheduledCron.getCronKey() + "未纳入到spring管理", e);
            }
            Assert.isAssignable(ScheduledOfTask.class, task.getClass(), "定时任务类必须实现ScheduledOfTask接口");
            // 可以通过改变数据进而实现动态改变执行周期
            taskRegistrar.addTriggerTask(((Runnable) task),
                    triggerContext -> {
                        String cronExpression = cronRepository.findByCronKey(springScheduledCron.getCronKey()).getCronExpression();
                        return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);
                    }
            );
        }

    }

    @Bean
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }

}

  

public interface ScheduledOfTask extends Runnable {
    /**
     * 定时任务方法
     */
    void execute();
    /**
     * 实现控制定时任务启用或禁用的功能
     */
    @Override
    default void run() {
        SpringScheduledCronRepository repository = SpringUtils.getBean(SpringScheduledCronRepository.class);
        SpringScheduledCron scheduledCron = repository.findByCronKey(this.getClass().getName());
        if ("".equals(scheduledCron.getStatus())) {
            return;
        }
        execute();
    }
}


@Component
public class DynamicPrintTask implements ScheduledOfTask {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private int i;

    @Override
    public void execute() {
        logger.info("thread id:{},DynamicPrintTask execute times:{}", Thread.currentThread().getId(), ++i);
    }

}

  

1|com.schedule.DynamicPrintTask|*/10 * * * * ?|5s执行一次|1

  

posted @ 2020-09-01 17:59  凉城  阅读(4991)  评论(0编辑  收藏  举报