1. 程式人生 > 其它 >記錄spring boot整合quartz實現定時任務

記錄spring boot整合quartz實現定時任務

技術標籤:spring boot

1、新增maven依賴

程式碼如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2、實現job介面,並在execute方法中實現業務邏輯

程式碼如下:

public class PrintWordsJob implements
Job { private static final Logger logger = LoggerFactory.getLogger(PrintWordsJob.class); @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { String printTime = new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(new Date
()); // 這裡處理簡單,只做列印時間,getMergedJobDataMap()方法是獲取 JobDetail 中傳遞的的 usingJobData logger.info("PrintWordsJob start at: {}, map: {}", printTime, jobExecutionContext.getMergedJobDataMap().get("name")); } }

3、實現一個簡單的定時任務

程式碼如下:

    public void test() throws SchedulerException {
// 定義作業的例項 JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class) // 任務標識,及任務分組 .withIdentity("job", "group") // 連結呼叫,增加需要的引數 .usingJobData("name","guaniu") .build(); // 觸發器 SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger() .withIdentity("trigger", "group") // 立即執行 .startNow() // 10s後停止 .endAt(new Date(System.currentTimeMillis()+10*1000)) .withSchedule( SimpleScheduleBuilder.simpleSchedule() // 每秒執行一次 .withIntervalInSeconds(1) // 一直執行 .repeatForever() ).build(); scheduler.scheduleJob(jobDetail, simpleTrigger); }

簡單封裝的工具類

程式碼如下:

@Component
public class QuartzUtils {

    private static final Logger logger = LoggerFactory.getLogger(QuartzUtils.class);

    @Autowired
    private Scheduler scheduler;
    
    /**
     * @param quartzDataDomain
     * {
     *     "jobName": "guaniu",
     *     "jobGroup": "test",
     *     "cron": "0/2 * * * * ?",
     *     "triggerName": "manual",
     *     "triggerGroup": "manualGroup",
     *     "usingJobDataMap": {
     *         "name": "guaniu"
     *     },
     *     "category": "create"
     * }
     * jobName、jobGroup要在前端傳值試效驗,保證唯一不重複,
     * 否則會報錯:Unable to store Job : 'test1.guaniu1', because one already exists with this identification.
     */
    public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        String category = quartzDataDomain.getCategory();
        if (category.equals("create")){
            createJob(quartzDataDomain);
        }else if (category.equals("modify")){
            modifyJob(quartzDataDomain);
        }else if (category.equals("pause")){
            pauseJob(quartzDataDomain);
        }else if (category.equals("resume")){
            resumeJob(quartzDataDomain);
        }else if (category.equals("deleteJob")){
            deleteJob(quartzDataDomain);
        }
    }

    public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        String category = quartzDataDomain.getCategory();
        if (category.equals("create")){
            createJob(quartzDataDomain);
        }else if (category.equals("modify")){
            modifyJob(quartzDataDomain);
        }else if (category.equals("pause")){
            pauseJob(quartzDataDomain);
        }else if (category.equals("resume")){
            resumeJob(quartzDataDomain);
        }else if (category.equals("deleteJob")){
            deleteJob(quartzDataDomain);
        }
    }

//    建立並有執行job
    private void createJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
//        如果這個任務存在就刪除
        deleteJob(quartzDataDomain);

        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
                .withSchedule(cronScheduleBuilder)
                .build();

        scheduler.scheduleJob(initJobDetail(quartzDataDomain), trigger);
    }

//    修改job的cron
    private void modifyJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());
        TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(quartzDataDomain.getCron())){
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
                    .withSchedule(cronScheduleBuilder)
                    .build();

            scheduler.rescheduleJob(triggerKey, trigger);
        }
    }

//    暫停job
    private void pauseJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        JobKey jobKey = initJobKey(quartzDataDomain);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);

        if(jobDetail != null){
            scheduler.pauseJob(jobKey);
        }
    }

//    暫停所有的job
//    public void pauseAllJob() throws SchedulerException {
//        scheduler.pauseAll();
//    }


//    重新執行job
    private void resumeJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        JobKey jobKey = initJobKey(quartzDataDomain);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail != null){
            scheduler.resumeJob(jobKey);
        }
    }

//    重新執行所有的job
//    public void resumeAllJob() throws SchedulerException {
//        scheduler.resumeAll();
//    }

//    刪除job
    private void deleteJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
        JobKey jobKey = initJobKey(quartzDataDomain);
        Trigger trigger =  scheduler.getTrigger(triggerKey);

        if(trigger != null){
            // 停止觸發器
            scheduler.pauseTrigger(triggerKey);
            // 移除觸發器
            scheduler.unscheduleJob(triggerKey);
            // 刪除任務
            scheduler.deleteJob(jobKey);
        }
    }

    public String checkTriggerStatus(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        String result;
        Trigger.TriggerState triggerState = scheduler.getTriggerState(TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup()));
        switch (triggerState){
            case NONE:
                result = "不存在";
                logger.info("status: {}, quartzDataDomain: {}", "不存在", quartzDataDomain);
                return result;
            case ERROR:
                result = "錯誤";
                logger.info("status: {}, quartzDataDomain: {}", "錯誤", quartzDataDomain);
                return result;
            case NORMAL:
                result = "正常";
                logger.info("status: {}, quartzDataDomain: {}", "正常", quartzDataDomain);
                return result;
            case PAUSED:
                result = "暫停";
                logger.info("status: {}, quartzDataDomain: {}", "暫停", quartzDataDomain);
                return result;
            case BLOCKED:
                result = "阻塞";
                logger.info("status: {}, quartzDataDomain: {}", "阻塞", quartzDataDomain);
                return result;
            case COMPLETE:
                result = "完成";
                logger.info("status: {}, quartzDataDomain: {}", "完成", quartzDataDomain);
                return result;
            default:
                result = "未知現象";
                logger.info("status: {}, quartzDataDomain: {}", triggerState, quartzDataDomain);
        }
        return result;
    }

    private static JobKey initJobKey(QuartzDataDomain quartzDataDomain){
        return new JobKey(quartzDataDomain.getJobName(), quartzDataDomain.getJobGroup());
    }
    
    private static JobDetail initJobDetail(QuartzDataDomain quartzDataDomain){
        JobDataMap jobDataMap = new JobDataMap();
        Map<String, Object> map = quartzDataDomain.getUsingJobDataMap();
        if (map != null && !map.isEmpty()){
            for (Map.Entry<String, Object> m: map.entrySet()) {
                jobDataMap.put(m.getKey(), m.getValue());
            }
            return JobBuilder.newJob(PrintWordsJob.class)
                    .withIdentity(initJobKey(quartzDataDomain))
                    .usingJobData(jobDataMap)
                    .build();
        }else {
            return JobBuilder.newJob(PrintWordsJob.class)
                    .withIdentity(initJobKey(quartzDataDomain))
                    .build();
        }
    }
}
public class QuartzDataDomain {
    private String jobName;
    private String jobGroup;
    private String cron;
    private String triggerName;
    private String triggerGroup;
    private Map<String, Object> usingJobDataMap;
    private String category;

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron;
    }

    public String getTriggerName() {
        return triggerName;
    }

    public void setTriggerName(String triggerName) {
        this.triggerName = triggerName;
    }

    public String getTriggerGroup() {
        return triggerGroup;
    }

    public void setTriggerGroup(String triggerGroup) {
        this.triggerGroup = triggerGroup;
    }

    public Map<String, Object> getUsingJobDataMap() {
        return usingJobDataMap;
    }

    public void setUsingJobDataMap(Map<String, Object> usingJobDataMap) {
        this.usingJobDataMap = usingJobDataMap;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    @Override
    public String toString() {
        return "QuartzDataDomain{" +
                "jobName='" + jobName + '\'' +
                ", jobGroup='" + jobGroup + '\'' +
                ", cron='" + cron + '\'' +
                ", triggerName='" + triggerName + '\'' +
                ", triggerGroup='" + triggerGroup + '\'' +
                ", usingJobDataMap=" + usingJobDataMap +
                ", category='" + category + '\'' +
                '}';
    }
}