package com.sandu.common.quartz.service; import com.sandu.common.execption.BusinessException; 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 * @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, Long jobId, String cron, Map jobData) { try { String simpleName = jobClass.getSimpleName(); JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(simpleName + jobId) .build(); CronTrigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity(simpleName + jobId) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule(cron)) .build(); 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("创建定时任务失败"); } } @Override public void updateJobCron(Class jobClass, Long jobId, String cron, Map jobData) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); if (trigger == null) { addJob(jobClass, jobId, cron, jobData); trigger = (CronTrigger) scheduler.getTrigger(triggerKey); } CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); trigger.getJobDataMap().putAll(jobData); 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); log.info("删除定时器{}", jobClass.getSimpleName() + jobId); } 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, Long jobId, String cron, Map jobData) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 如果不存在则创建一个定时任务 if (trigger == null) { addJob(jobClass, jobId, cron, jobData); } JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId); scheduler.resumeJob(jobKey); } catch (Exception e) { log.error("恢复定时任务失败", e); throw new BusinessException("恢复定时任务失败"); } } @Override public void runJobNow(Class jobClass, Long jobId, String cron, Map jobData) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 如果不存在则创建一个定时任务 if (trigger == null) { addJob(jobClass, jobId, cron, jobData); } JobDataMap dataMap = new JobDataMap(); dataMap.putAll(jobData); JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId); scheduler.triggerJob(jobKey, dataMap); } catch (Exception e) { log.error("定时任务执行失败", e); throw new BusinessException("定时任务执行失败"); } } }