技术成就梦想

Spring Boot Task定时任务升级(启动、停止、变更执行周期) 原 Spring Boot Task定时任务升级(启动、停止、变更执行周期) 阿刚ABC



本文章主要描述了,如何动态添加、修改、删除定时任务?

请参照Spring Boot Task实现定时任务创建项目。

开始案例代码编写吧!

编写一个简单的线程:

package org.lvgang;

import java.util.Date;

/**
 * 创建一个线程,给定时任务调用
 * @author lvgang
 */
public class MyRunnable implements Runnable {
	public void run() {
		System.out.println("MyRunnable.run()," + new Date());
	}
}

编写动态Task类,主要实现通过URL控制任何的添加修改等等。

package org.lvgang;

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 DynamicTaskController {
 
    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
    
    /**
     * 在ScheduledFuture中有一个cancel可以停止定时任务。
     */
    private ScheduledFuture<?> future;
 
    /**
     * ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。
     * ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)
     * @return
     */
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
       return new ThreadPoolTaskScheduler();
    }
 
    /**
     * 启动任务
     **/
    @RequestMapping("/startTask")
    public String startCron() {
       future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));
       System.out.println("DynamicTaskController.startCron()");
       return "startTask";
    }
    
    /**
     * 启此任务
     **/
    @RequestMapping("/stopTask")
    public String stopCron() {
       if (future != null) {
           future.cancel(true);
       }
       System.out.println("DynamicTaskController.stopCron()");
       return "stopTask";
    }
 
    /**
     * 变更任务间隔,再次启动
     **/
    @RequestMapping("/changeCron")
    public String changeCron() {
       stopCron();// 先停止,在开启.
       future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));
       System.out.println("DynamicTaskController.changeCron()");
       return "changeCron";
    }
 
}

注:上面类中有几个点需要了解:

  • 一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。
  • ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)
  • 在ScheduledFuture中有一个cancel可以停止定时任务。

配置文件及项目启动类已经在“Spring Boot Task实现定时任务”文章中描述,在此不做重复描述。直接启动项目。

项目启动后,在浏览器中输入“http://localhost:8080/startTask”,页面会输入“startTask”,表示任务已经启动成功,观察控制台会输出以下信息,表示任务在定时调度执行。

MyRunnable.run(),Sat Dec 16 23:31:40 CST 2017
MyRunnable.run(),Sat Dec 16 23:31:45 CST 2017
MyRunnable.run(),Sat Dec 16 23:31:50 CST 2017
MyRunnable.run(),Sat Dec 16 23:31:55 CST 2017
MyRunnable.run(),Sat Dec 16 23:32:00 CST 2017
MyRunnable.run(),Sat Dec 16 23:32:05 CST 2017
MyRunnable.run(),Sat Dec 16 23:32:10 CST 2017
MyRunnable.run(),Sat Dec 16 23:32:15 CST 2017
MyRunnable.run(),Sat Dec 16 23:32:20 CST 2017
MyRunnable.run(),Sat Dec 16 23:32:25 CST 2017

在浏览器中输入“http://localhost:8080/stopTask”,页面会输入“stopTask”,表示任务已经停止成功,观察控制台会输出以下信息,表示任务已经停止执行。

MyRunnable.run(),Sat Dec 16 23:33:20 CST 2017
MyRunnable.run(),Sat Dec 16 23:33:25 CST 2017
DynamicTaskController.stopCron()

在浏览器中输入“http://localhost:8080/changeCron”,页面会输入“changeCron”,表示任务已经调整调度周期,改为10秒一次, 观察控制台会输出以下信息,表示任务调整成功。

DynamicTaskController.stopCron()
DynamicTaskController.changeCron()
MyRunnable.run(),Sat Dec 16 23:34:40 CST 2017
MyRunnable.run(),Sat Dec 16 23:34:50 CST 2017
MyRunnable.run(),Sat Dec 16 23:35:00 CST 2017
MyRunnable.run(),Sat Dec 16 23:35:10 CST 2017
MyRunnable.run(),Sat Dec 16 23:35:20 CST 2017
MyRunnable.run(),Sat Dec 16 23:35:30 CST 2017

 

通过以上案例就可以完成动态添加、修改、删除定时任务