(1)springboot2運用quartz,pom.xml加載spring-boot-starter-quartz架包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
(2) QuartzConfiguration配置類
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class QuartzConfiguration {
// 配置定時任務1
@Bean(name = "firstJobDetail")
public MethodInvokingJobDetailFactoryBean firstJobDetail(Task1 entity) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否併發執行
jobDetail.setConcurrent(false);
// 爲需要執行的實體類對應的對象
jobDetail.setTargetObject(entity);
// 需要執行的方法
jobDetail.setTargetMethod("getData1");
return jobDetail;
}
// 配置觸發器1
@Bean(name = "firstTrigger")
public CronTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail( firstJobDetail );
trigger.setStartTime(new Date());
// cron表達式(設置間隔60s) 7天(d)=604800000毫秒(ms)
trigger.setCronExpression("0/5 * * * * ?");
return trigger;
}
// 配置定時任務2
@Bean(name = "secondJobDetail")
public MethodInvokingJobDetailFactoryBean secondJobDetail(Task2 entity) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否併發執行
jobDetail.setConcurrent(true);
// 爲需要執行的實體類對應的對象
jobDetail.setTargetObject(entity);
// 需要執行的方法
jobDetail.setTargetMethod("getData2");
return jobDetail;
}
// 配置觸發器2
@Bean(name = "secondTrigger")
public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(secondJobDetail);
trigger.setStartTime(new Date());
// cron表達式(設置間隔60s) 7天(d)=604800000毫秒(ms)
trigger.setCronExpression("0/5 * * * * ?");
return trigger;
}
// 配置Scheduler
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 延時啓動,應用啓動1秒後
bean.setStartupDelay(1);
// 註冊觸發器
bean.setTriggers(firstTrigger,secondTrigger);
return bean;
}
}
2個task類Task1、Task2
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class Task2 {
public void getData2(){
System.out.println("===啓動Job2:" + LocalDateTime.now()+"===");
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
System.out.println("MyJob作業調度2-現在時間:" + dateFormat.format(new Date()));
}
}
@Component
@EnableScheduling
public class Task2 {
public void getData2(){
System.out.println("===啓動Job2:" + LocalDateTime.now()+"===");
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
System.out.println("MyJob作業調度2-現在時間:" + dateFormat.format(new Date()));
}
}
(3)修改數據庫Cron: 0/10 * * * * ?,定時器重新執行ScheduleRefreshService
@Configuration
@EnableScheduling
@Component
public class ScheduleRefreshService {
@Autowired
private QuartzConfigMapper configMapper;
@Resource(name = "scheduler")
private Scheduler scheduler;
@Resource(name = "firstJobDetail")
private JobDetail firstJobDetail;
@Resource(name = "firstTrigger")
private CronTrigger firstTrigger;
@Resource(name = "secondTrigger")
private CronTrigger secondTrigger;
@Resource(name = "thirdTrigger")
private CronTrigger thirdTrigger;
@Scheduled(cron="0 */1 * * * ?")
public void scheduleUpdateCronTrigger() throws SchedulerException {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(firstTrigger.getKey());
//當前Trigger使用的
String currentCron = trigger.getCronExpression();
System.out.println("1-->currentCron Trigger:"+ currentCron);
//mapper操作數據庫從數據庫查詢出來的
String searchCron = configMapper.findOne(1).getCron();
System.out.println("1-->searchCron Trigger:"+ searchCron);
if (currentCron.equals(searchCron)) {
// 如果當前使用的cron表達式和從數據庫中查詢出來的cron表達式一致,則不刷新任務
} else {
//表達式調度構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);
//按新的cronExpression表達式重新構建trigger
trigger = (CronTrigger) scheduler.getTrigger(firstTrigger.getKey());
trigger = trigger.getTriggerBuilder().withIdentity(firstTrigger.getKey()).withSchedule(scheduleBuilder).build();
//按新的trigger重新設置job執行
scheduler.rescheduleJob(firstTrigger.getKey(), trigger);
currentCron = searchCron;
}
}
@Scheduled(cron="0 */2 * * * ?")
public void scheduleUpdateCronTrigger2() throws SchedulerException {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(secondTrigger.getKey());
//當前Trigger使用的
String currentCron = trigger.getCronExpression();
System.out.println("2-->currentCron Trigger:"+ currentCron);
//mapper操作數據庫從數據庫查詢出來的
String searchCron = configMapper.findOne(2).getCron();
System.out.println("2-->searchCron Trigger:"+ searchCron);
if (currentCron.equals(searchCron)) {
// 如果當前使用的cron表達式和從數據庫中查詢出來的cron表達式一致,則不刷新任務
} else {
//表達式調度構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);
//按新的cronExpression表達式重新構建trigger
trigger = (CronTrigger) scheduler.getTrigger(secondTrigger.getKey());
trigger = trigger.getTriggerBuilder().withIdentity(secondTrigger.getKey()).withSchedule(scheduleBuilder).build();
//按新的trigger重新設置job執行
scheduler.rescheduleJob(secondTrigger.getKey(), trigger);
currentCron = searchCron;
}
}
@Scheduled(cron="0 */3 * * * ?")
public void scheduleUpdateCronTrigger3() throws SchedulerException {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(thirdTrigger.getKey());
//當前Trigger使用的
String currentCron = trigger.getCronExpression();
System.out.println("3-->currentCron Trigger:"+ currentCron);
//mapper操作數據庫從數據庫查詢出來的
String searchCron = configMapper.findOne(3).getCron();
System.out.println("3-->searchCron Trigger:"+ searchCron);
if (currentCron.equals(searchCron)) {
// 如果當前使用的cron表達式和從數據庫中查詢出來的cron表達式一致,則不刷新任務
} else {
//表達式調度構建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);
//按新的cronExpression表達式重新構建trigger
trigger = (CronTrigger) scheduler.getTrigger(thirdTrigger.getKey());
trigger = trigger.getTriggerBuilder().withIdentity(thirdTrigger.getKey()).withSchedule(scheduleBuilder).build();
//按新的trigger重新設置job執行
scheduler.rescheduleJob(thirdTrigger.getKey(), trigger);
currentCron = searchCron;
}
}
}
實體類Config與數據庫操作接口了QuartzConfigMapper,QuartzConfigMapper採用註解直接查詢
public class Config {
private Integer id;
private String cron;
public Config() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
}
public interface QuartzConfigMapper {
@Select("SELECT * FROM config t where id = #{id}")
Config findOne(int id);
}
注意: Application 添加掃描MapperScan()你自己的包名稱
@MapperScan("com.*.mapper")
public class Application
表結構sql
DROP TABLE IF EXISTS `config`;
CREATE TABLE `config` (
`id` int(10) NOT NULL,
`cron` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of config
-- ----------------------------
INSERT INTO `config` VALUES (1, '0/10 * * * * ?');
INSERT INTO `config` VALUES (2, '0/20 * * * * ?');
INSERT INTO `config` VALUES (3, '0/30 * * * * ?');
運行
===啓動Job1:2021-03-04T16:49:50.001===
MyJob作業調度1-現在時間:16:49:50
===啓動Job2:2021-03-04T16:50:00.002===
MyJob作業調度2-現在時間:16:50:00