基于Spring的动态定时器

       为了使定时器功能更加灵活,做到页面控制cron表达式。并且以往大多数定时任务还是写在.xml配置里面的,这样写的最大缺点就是如果因为公司需要把定时任务执行的时间、或者是执行类更换,就需要修改.xml代码并重新提交发布版本才行。

 

首先需要使用的包:

import java.util.concurrent.ScheduledFuture;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;

实现功能的业务逻辑层:

先定义静态的任务线程池、存放不同调度对象的map、日志打印对象(可有可无);使用静态的原因是不需要new类对象来调用,而且线程池在加载类时就自动开启。

/*动态定时任务*/
    private static Logger logger = LoggerFactory.getLogger(xxxx.class);
    private static Map<String, ScheduledFuture<?>> sMap=new HashMap<>();
    private static ThreadPoolTaskScheduler threadPoolTaskScheduler=new ThreadPoolTaskScheduler();
    static {
        threadPoolTaskScheduler.initialize();
        logger.info("定时任务线程池启动===================================");
    }

 启动定时任务方法(可根据自己需求拆分成启动方法、关闭方法、修改方法):

public synchronized void startTask(String xxxx){
        ScheduledFuture<?> future=sMap.get(xxxx);
        if(future !=null && !future.isCancelled()) {
            future.cancel(true);
        }
        future = threadPoolTaskScheduler.schedule(new Runnable() {
            @Override
            public void run() {
                logger.info("执行预警定时器================================》"+warnType);
                //处理业务逻辑
            }
        }, new CronTrigger(cron));//可声明变量动态获取cron表达式
        
        sMap.put(xxxx, future);
        
    }

 

posted @ 2020-11-05 10:48  嘻嘻哈哈大只佬  阅读(374)  评论(0编辑  收藏  举报