2021与蓝度共同重构项目,服务端
chenjiantian
2021-12-16 0f98ec728d0403b1726273d94dc00f06993888b6
sandu-common/src/main/java/com/sandu/common/quartz/service/QuartzServiceImpl.java
@@ -1,14 +1,16 @@
package com.sandu.common.quartz.service;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.quartz.ExecutionJob;
import com.sandu.common.quartz.dto.QuartzJobDto;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
/**
 * @author chenjiantian
@@ -24,20 +26,22 @@
    private Scheduler scheduler;
    @Override
    public void addJob(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void addJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            String simpleName = jobClass.getSimpleName();
            JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class)
                    .withIdentity(simpleName + quartzJobDto.getId())
            JobDetail jobDetail = JobBuilder.newJob(jobClass)
                    .withIdentity(simpleName + jobId)
                    .build();
            CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                    .withIdentity(simpleName + quartzJobDto.getId())
                    .withSchedule(CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression()))
                    .withIdentity(simpleName + jobId)
                    .startNow()
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                    .build();
            cronTrigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto);
            cronTrigger.getJobDataMap().putAll(jobData);
            ((CronTriggerImpl) cronTrigger).setStartTime(new Date());
            scheduler.scheduleJob(jobDetail, cronTrigger);
            log.info("添加定时器{}", simpleName + jobId);
        } catch (SchedulerException e) {
            log.error("创建定时任务失败", e);
            throw new BusinessException("创建定时任务失败");
@@ -45,17 +49,17 @@
    }
    @Override
    public void updateJobCron(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void updateJobCron(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                addJob(jobClass, quartzJobDto);
                addJob(jobClass, jobId, cron, jobData);
                trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            }
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression());
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
            trigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto);
            trigger.getJobDataMap().putAll(jobData);
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
@@ -70,6 +74,7 @@
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
            scheduler.pauseJob(jobKey);
            scheduler.deleteJob(jobKey);
            log.info("删除定时器{}", jobClass.getSimpleName() + jobId);
        } catch (SchedulerException e) {
            log.error("删除定时任务失败", e);
            throw new BusinessException("删除定时任务失败");
@@ -88,15 +93,15 @@
    }
    @Override
    public void resumeJob(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void resumeJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            // 如果不存在则创建一个定时任务
            if (trigger == null) {
                addJob(jobClass, quartzJobDto);
                addJob(jobClass, jobId, cron, jobData);
            }
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId());
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
            scheduler.resumeJob(jobKey);
        } catch (Exception e) {
            log.error("恢复定时任务失败", e);
@@ -105,17 +110,17 @@
    }
    @Override
    public void runJobNow(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void runJobNow(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            // 如果不存在则创建一个定时任务
            if (trigger == null) {
                addJob(jobClass, quartzJobDto);
                addJob(jobClass, jobId, cron, jobData);
            }
            JobDataMap dataMap = new JobDataMap();
            dataMap.put(QuartzJobDto.JOB_KEY, quartzJobDto);
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId());
            dataMap.putAll(jobData);
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
            scheduler.triggerJob(jobKey, dataMap);
        } catch (Exception e) {
            log.error("定时任务执行失败", e);