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.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * @author chenjiantian * @date 2021/12/15 10:39 * quartz job管理类 */ @Slf4j @Service @ConditionalOnProperty(prefix = "sandu.quartz", name = "enable", havingValue = "true") public class QuartzServiceImpl implements QuartzService { @Resource(name = "scheduler") private Scheduler scheduler; @Override public void addJob(Class jobClass, QuartzJobDto quartzJobDto) { try { String simpleName = jobClass.getSimpleName(); JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class) .withIdentity(simpleName + quartzJobDto.getId()) .build(); CronTrigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity(simpleName + quartzJobDto.getId()) .withSchedule(CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression())) .build(); cronTrigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto); scheduler.scheduleJob(jobDetail, cronTrigger); } catch (SchedulerException e) { log.error("创建定时任务失败", e); throw new BusinessException("创建定时任务失败"); } } @Override public void updateJobCron(Class jobClass, QuartzJobDto quartzJobDto) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); if (trigger == null) { addJob(jobClass, quartzJobDto); trigger = (CronTrigger) scheduler.getTrigger(triggerKey); } CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression()); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); trigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto); scheduler.rescheduleJob(triggerKey, trigger); } catch (SchedulerException e) { log.error("更新定时任务失败", e); throw new BusinessException("更新定时任务失败"); } } @Override public void deleteJob(Class jobClass, Long jobId) { try { JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId); scheduler.pauseJob(jobKey); scheduler.deleteJob(jobKey); } catch (SchedulerException e) { log.error("删除定时任务失败", e); throw new BusinessException("删除定时任务失败"); } } @Override public void pauseJob(Class jobClass, Long jobId) { try { JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId); scheduler.pauseJob(jobKey); } catch (Exception e) { log.error("定时任务暂停失败", e); throw new BusinessException("定时任务暂停失败"); } } @Override public void resumeJob(Class jobClass, QuartzJobDto quartzJobDto) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 如果不存在则创建一个定时任务 if (trigger == null) { addJob(jobClass, quartzJobDto); } JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId()); scheduler.resumeJob(jobKey); } catch (Exception e) { log.error("恢复定时任务失败", e); throw new BusinessException("恢复定时任务失败"); } } @Override public void runJobNow(Class jobClass, QuartzJobDto quartzJobDto) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 如果不存在则创建一个定时任务 if (trigger == null) { addJob(jobClass, quartzJobDto); } JobDataMap dataMap = new JobDataMap(); dataMap.put(QuartzJobDto.JOB_KEY, quartzJobDto); JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId()); scheduler.triggerJob(jobKey, dataMap); } catch (Exception e) { log.error("定时任务执行失败", e); throw new BusinessException("定时任务执行失败"); } } }