基于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); }