电子说
如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲:
(1)简单方式:修改定时任务的执行周期;
(2)动态修改定时任务的执行周期;
接下来看下本节的具体内容:
(1)简单方式:修改定时任务的执行周期;
按正常来讲,修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?哈哈,那是必须的必。
(2)动态修改定时任务的执行周期;
首先我们先会回顾下,我们之前是使用了@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。那么如何动态修改呢,我们看下步骤:
① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
② 设置一个静态的cron,用于存放任务执行周期参数。
③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。
④ 设置任务触发器,触发任务执行。
具体的代码如下:
package com.kfit.task;
import java.util.Date;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
importorg.springframework.scheduling.annotation.EnableScheduling;
importorg.springframework.scheduling.annotation.SchedulingConfigurer;
importorg.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
/**
*/
@Component
@EnableScheduling
**public **class TaskCronChange implements SchedulingConfigurer{
**public ****static** String *cron* ;
**public** TaskCronChange() {
//默认情况是:每5秒执行一次.
*cron* = "0/5 * * * * *";
**new** Thread(**new** Runnable() {
// 开启新线程模拟外部更改了任务执行周期.
@Override
**public ****void** run() {
**try** {
// 让线程睡眠 15秒.
Thread. *sleep* (15000);
} **catch** (InterruptedException e) {
e.printStackTrace();
}
//修改为:每10秒执行一次.
*cron* = "0/10 * ** * *";
System. ***err*** .println("cron change to:"+ *cron* );
}
}).start();;
}
@Override
**public ****void** configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Runnable task = **new** Runnable() {
@Override
**public ****void** run() {
//任务逻辑代码部分.
System. ***out*** .println("TaskCronChangetask is running ... "+ **new** Date());
}
};
Trigger trigger = **new** Trigger() {
@Override
**public** Date nextExecutionTime(TriggerContext triggerContext) {
//任务触发,可修改任务的执行周期.
CronTrigger trigger = **new** CronTrigger( *cron* );
Date nextExec = trigger.nextExecutionTime(triggerContext);
**return **nextExec;
}
};
taskRegistrar.addTriggerTask(task, trigger);
}
}
这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。
启动查看控制台的打印信息如下:
TaskCronChange task is running ... Thu Apr 0605:38:20 CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:25CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:30CST 2017
cronchange to:0/10 * * * * *
TaskCronChangetask is running ... Thu Apr 06 05:38:35CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:40CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:50CST 2017
全部0条评论
快来发表一下你的评论吧 !