一、动态修改cron表达式
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;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
/**
* Created by lq on 2018/10/7.
*/
@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());
}
}
}
二、通过数据库修改表达式
(1)、在数据库中建一张表cron
属性:cron_id,cron
(2)、建立一个和表对应的持久化类
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* Created by lq on 2018/10/7.
*/
@Data
@Entity
public class Cron {
@GeneratedValue
@Id
private Integer cronId;
private String cron;
public Cron() {
}
public Cron(String cron) {
this.cron = cron;
}
}
(3)、写一个CronRepository接口
import com.lq.bean.Cron;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* Created by lq on 2018/10/7.
*/
public interface CronRepository extends JpaRepository<Cron,Integer>{
}
(4)、实现
import com.lq.dao.CronRepository;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* Created by lq on 2018/10/7.
*/
@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);
}
);
}
}
网友评论