springboot2-多個動態定時任務quartz使用-綜合運用(四)

(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章