【草稿】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实现定时任务

https://blog.csdn.net/w47_csdn/article/details/84971870?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

posted @ 2020-02-28 17:05  风灵苏  阅读(566)  评论(0)    收藏  举报