• springboot定时任务


    (1)思路说明;

    (a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

    (b)ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)

    (c)在ScheduledFuture中有一个cancel可以停止定时任务。

    (2)代码解析;

           根据以上的思路分析,我们很容易就知道如何进行编码了,先提供代码如下:

    package com.kfit.task;

    import java.util.Date;

    import java.util.concurrent.ScheduledFuture;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.context.annotation.Bean;

    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

    import org.springframework.scheduling.support.CronTrigger;

    import org.springframework.stereotype.Component;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    /**

     * @author Angel --守护天使

     * @version v.0.1

     * @date 2017年4月6日

     */

    @RestController

    @Component

    public class DynamicTask {

        @Autowired

        private ThreadPoolTaskScheduler threadPoolTaskScheduler;

        private ScheduledFuture<?> future;

        @Bean

        public ThreadPoolTaskScheduler threadPoolTaskScheduler() {

           return new ThreadPoolTaskScheduler();

        }

        @RequestMapping("/startCron")

        public String startCron() {

           future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));

           System.out.println("DynamicTask.startCron()");

           return "startCron";

        }

        @RequestMapping("/stopCron")

        public String stopCron() {

           if (future != null) {

               future.cancel(true);

           }

           System.out.println("DynamicTask.stopCron()");

           return "stopCron";

        }

        @RequestMapping("/changeCron10")

        public String startCron10() {

           stopCron();// 先停止,在开启.

           future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));

           System.out.println("DynamicTask.startCron10()");

           return "changeCron10";

        }

        private class MyRunnable implements Runnable {

           @Override

           public void run() {

               System.out.println("DynamicTask.MyRunnable.run()," + new Date());

           }

        }

    }

    (a)我们首先了一个类DynamicTask;
    (b)定义了两个变量,threadPoolTaskScheduler和future 其中future是treadPoolTaskScheduler执行方法schedule的返回值,主要用于定时任务的停止。
    (c)编写启动定时器的方法startCron();
    (d)编写停止方法stopCron(),这里编码的时候,需要注意下需要判断下future为null的时候,不然就很容易抛出NullPointerException;
    (e)编写修改定时任务执行周期方法changeCron10(),这里的原理就是关闭之前的定时器,创新在创建一个新的定时器。

    (3)修改定时任务执行周期特别说明;

           在上一篇博客中,我们使用了一种方式通过全局变量的方式修改cron参数的值,那么在这里的我们也是可以这么做的,这里简单提供下思路,大家自己去实现。

    注意ThreadPoolTaskScheduler中的schedule()第二个参数支持Trigger:

    ThreadPoolTaskScheduler.schedule(Runnable arg0, Trigger arg1)

    那么我们就可以自己定义一个Trigger,然后动态进行修改了,这里提供核心的代码如下:

    private String cronStr = "*/5 * * * * *";

        @RequestMapping("/startCron1")

        public String startCron1(){

            System.out.println("startCron1 >>>>");

            threadPoolTaskScheduler.schedule(new MyRunnable(), new Trigger(){

                @Override

                public Date nextExecutionTime(TriggerContext triggerContext){

                    returnnew CronTrigger(cronStr).nextExecutionTime(triggerContext);

                }

            });

            System.out.println("startCron1 <<<<");

            return "startCron1";

        }

  • 相关阅读:
    Mysql源码学习——Connection Manager
    MySQL源码学习——MDL字典锁
    Mysql源码学习——用户认证原理与实现
    Mysql源码学习——Thread Manager
    你真的了解如何登录MySQL么?
    CSDN密码库窥视各大数据库性能
    Mysql源码学习——没那么简单的Hash
    How to use NoSQL in MySQL
    Oracle的聚簇也Hold不住了
    Python 错误解决方法
  • 原文地址:https://www.cnblogs.com/java-xz/p/7744097.html
Copyright © 2020-2023  润新知