| | |
| | | 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 |
| | |
| | | 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("创建定时任务失败"); |
| | |
| | | } |
| | | |
| | | @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) { |
| | |
| | | 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 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); |
| | |
| | | } |
| | | |
| | | @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); |