动态修改cron表达式
@RestController
@Component
public class DynamicTask {
/**
* 线程池任务调度类,能够开启线程池进行任务调度。
*/
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
/**
* 定时计划ScheduledFuture
*/
private ScheduledFuture<?> future;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
/**
* ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,
* 在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)
*/
@RequestMapping("/startCron")
public String startCron() {
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));
System.out.println("DynamicTask.startCron()");
return "startCron";
}
/**
* 在ScheduledFuture中有一个cancel可以停止定时任务。
* 参数为true便可以停止
* @return
*/
@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());
}
}
}
通过数据库修改表达式
-
在数据库中建一张表cron
属性:cron_id,cron
-
建立一个和表对应的持久化类
@Data
@Entity
public class Cron {
@GeneratedValue
@Id
private Integer cronId;
private String cron;
public Cron() {
}
public Cron(String cron) {
this.cron = cron;
}
}
-
写一个CronRepository接口
public interface CronRepository extends JpaRepository<Cron,Integer>{
}
-
实现
@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {
// 0/5 * * * * *
// */10 * * * * *
@Resource
private CronRepository cronRepository;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
() -> System.out.println("执行定时任务2: " + LocalDateTime.now().toLocalTime()),
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库获取执行周期
String cron = cronRepository.findById(23).get().getCron();
//2.2 合法性校验.
if (StringUtils.isEmpty(cron)) {
// Omitted Code ..
}
//2.3 返回执行周期(Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}