编写一个简单的线程:
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
通过以上案例就可以完成动态添加、修改、删除定时任务