个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
###写在前面的
在实际开发中定时任务的执行计划都不是固定的,根据不同的实际情况会指定不同的任务开启时间,停止时间,以及执行频率,所以动态的管理定时任务是一种实际开发中常见的设计。
###一、动态管理定时任务说明
使用Quartz来实现定时任务的管理是比较简单的,但是本次我们将使用Spring提供ThreadPoolTaskScheduler来实现,由于现在还未对Quartz深入学习,所以对Quartz不做过多解释。
ThreadPoolTaskScheduler是TaskScheduler接口的默认实现类,能够开启线程池进行任务调度,支持设置线程数,默认为单线程。
ThreadPoolTaskScheduler 通过schedule方法,添加定时任务和触发器后,会得到一个ScheduledFuture<?>类型的返回值,这个返回值可作为控制任务的开关。
###二、使用ThreadPoolTaskScheduler实现定时任务管理
示例代码如下:
@Component
public class DynamicTask {
private static Logger logger = Logger.getLogger(DynamicTask.class.getName());
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> task;
//采用注入的方式创建ThreadPoolTaskScheduler
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
//任务开始
public void startTask() {
task = threadPoolTaskScheduler.schedule(new Runnable() {
@Override
public void run() {
logger.info(new Date()+"0/2 * * * * *");
}
}, new CronTrigger("0/2 * * * * *"));
logger.info("开始任务!");
}
//任务停止
public String stopTask() {
if (task != null) {
task.cancel(true);
}
logger.info("任务停止!");
return "stopCron";
}
//更改计划,可以将更改的执行计划作为参数传入
public void changePlan() {
stopTask();
task = threadPoolTaskScheduler.schedule(new Runnable() {
@Override
public void run() {
logger.info(new Date()+"*/5 * * * * *");
}
}, new CronTrigger("*/5 * * * * *"));
logger.info("改变任务!");
}
}
以上代码只是一个简单的示例,更多的应用,大家根据实际情况来设计
个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片