【草稿】spring-task 动态修改,添加或关闭定时任务
本文如题所述,讨论一下基于springboot + spring-task创立的定时任务的动态添加,修改或关闭的实现方式。
1.以实现SchedulingConfigurer接口重写configureTasks的方法
@Configuration @EnableScheduling //经测试在springbootv2.0.3.RELEASE版本中,标注了@Async的定时任务其调度线程是自定义任务调度线程(如果定义了的话), //而不是spring默认的异步调度器SimpleAsyncTaskExecutor //而springbootv2.1.X.RELEASE及以上版本则不是这样。其会以@Async注解的用SimpleAsyncTaskExecutor,无@Async注解的用自定义任务调度线程 //故:我们可以再继续改写MyTaskConfig配置类,实现AsyncConfigurer,改写Async用自定义线程调度取代默认的。 @EnableAsync //public class MyTaskConfig { public class MyTaskConfig implements SchedulingConfigurer{ private static final Logger logger = LoggerFactory.getLogger(MyTaskConfig.class); @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // TODO Auto-generated method stub taskRegistrar.setTaskScheduler(getTaskScheduler()); //TODO:读取配置文件中的cron任务,实现初始化时的自定义添加定时任务 taskRegistrar.getScheduler().schedule(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "|SchedulingConfigurer cron task01"); } }, new CronTrigger("0/3 * * * * ?")); taskRegistrar.addCronTask(new CronTask(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "|SchedulingConfigurer cron task02"); } }, new CronTrigger("0/2 * * * * ?"))); logger.info("重写 SchedulingConfigurer.configureTasks 完成..."); } @Bean public TaskScheduler getTaskScheduler(){ ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(1);// 配置线程池大小,根据任务数量定制 taskScheduler.setThreadNamePrefix("demo-ThreadPoolTaskScheduler-thread-");// 线程名称前缀 //设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是被没有完成的任务阻塞 taskScheduler.setAwaitTerminationSeconds(60);// 线程池关闭前最大等待时间,确保最后一定关闭 taskScheduler.setWaitForTasksToCompleteOnShutdown(true);// 线程池关闭时等待所有任务完成 taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());// 任务丢弃策 logger.info("注入自定义线程调度Bean : 线程名前缀 {}, 线程池大小 {}", taskScheduler.getThreadNamePrefix(), taskScheduler.getPoolSize()); return taskScheduler; } }
这种实现方式,springboot项目需要停机,更改配置文件更新cron内容,重新启动项目。
下面在看看是否有可以不停服情况下启动任务的方法。
(博文撰写中)
...
...
参考文章:
1.[springboot] 基于Spring Task实现定时任务
莫道山前无路,迟早柳暗花开。把秤皆有天地在,自是公平买卖
浙公网安备 33010602011771号