• ThreadPoolTaskScheduler的使用,定时任务开启与关闭


    这里用的是Springboot框架。进行测试开发的,其实都是一样的。只不过这样比较方便测试。

    利用定时线程池任务调度,多利模式,

    定点查询任务,开启或关闭简单案例,如果任务有需求,那么就拼接cron表达式,传入定时任务即可。

    
    /**
     * @author: Licl
     **/
    @Component
    @Scope("prototype")
    public class DynamicTask {
    
        private final static Logger logger = LoggerFactory.getLogger(DynamicTask.class);
        private String cron;
        @Autowired
        private ThreadPoolTaskScheduler threadPoolTaskScheduler;
        private ScheduledFuture future;
    
        public void startCron() {
            cron = "0/1 * * * * ?";
            System.out.println(Thread.currentThread().getName());
            String name = Thread.currentThread().getName();
            future = threadPoolTaskScheduler.schedule(new myTask(name), new CronTrigger(cron));
            App.map.put(name, future);
        }
    
        public void stop() {
            if (future != null) {
                future.cancel(true);
            }
        }
    
        private class myTask implements Runnable {
            private String name;
    
            myTask(String name) {
                this.name = name;
            }
    
            @Override
            public void run() {
                System.out.println("test" + name);
            }
        }
    
    }

    创建一个map用来存储定时任务的回调对象。用于接下来的判断。并且初始化调度的线程池

    @SpringBootApplication
    public class App {
        // 线程存储器
    	public static ConcurrentHashMap<String, ScheduledFuture> map = new ConcurrentHashMap<String, ScheduledFuture>();
        // 启动入口
    	public static void main(String[] args) {
    		SpringApplication.run(App.class, args);
    	}
    
        // 创建线程
    	@Bean
    	public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
    		ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
    		executor.setPoolSize(20);
    		executor.setThreadNamePrefix("taskExecutor-");
    		executor.setWaitForTasksToCompleteOnShutdown(true);
    		executor.setAwaitTerminationSeconds(60);
    		return executor;
    	}
    
    }
    

    接下来进入测试方法,查看是否可以进行定时任务的定点停止。

    设定一个线程名称,进行模拟。以后部署在项目中可以是动态的。

    /**
     * @author: Licl
     * @Description: 测试类
     **/
    @RestController
    public class Test {
    
    	@Autowired
    	private DynamicTask task;
    	@RequestMapping("/task")
    	public void test() throws Exception {
    	    // 开启定时任务,对象注解Scope是多利的。
    		task.startCron();
    
    	}
    	@RequestMapping("/stop")
    	public void stop() throws Exception {
    	    // 提前测试用来测试线程1进行对比是否关闭。
            ScheduledFuture scheduledFuture = App.map.get("http-nio-8081-exec-1");
            scheduledFuture.cancel(true);
            // 查看任务是否在正常执行之前结束,正常true
            boolean cancelled = scheduledFuture.isCancelled();
            while (!cancelled) {
                scheduledFuture.cancel(true);
            }
        }
    }

    方法调用分析。测试log

  • 相关阅读:
    Docker基本命令及工作原理
    Docker安装
    linux命令
    MTPuTTy使用
    SpringBoot--swagger搭建、配置及使用
    idea使用技巧
    Idea插件
    IDEA开发工具使用 git 创建项目、拉取分支、合并分支
    git命令
    javbus爬虫-老司机你值得拥有
  • 原文地址:https://www.cnblogs.com/liclBlog/p/15349547.html
Copyright © 2020-2023  润新知