package com.example.xiaoshiweixinback.service.quartzService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.example.xiaoshiweixinback.business.exception.BusinessException; import com.example.xiaoshiweixinback.business.exception.ExceptionEnum; import com.example.xiaoshiweixinback.entity.quartz.QrtzTaskDTO; import com.example.xiaoshiweixinback.entity.quartz.QuartzVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Slf4j @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class JobService { private final Scheduler scheduler; /** * 删除job * * @throws SchedulerException */ public void deleteJob(Integer taskId) throws SchedulerException { QuartzVO quartzVO = this.generateQuartzVO(taskId); TriggerKey triggerKey = TriggerKey.triggerKey(quartzVO.getTriggerName(), quartzVO.getTriggerGroupName()); scheduler.pauseTrigger(triggerKey); scheduler.unscheduleJob(triggerKey); JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName()); scheduler.deleteJob(jobKey); } /** * 暂停job * * @throws SchedulerException */ public void pauseJob(Integer taskId) throws SchedulerException { QuartzVO quartzVO = this.generateQuartzVO(taskId); //更新任务条件状态 JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName()); scheduler.pauseJob(jobKey); } /** * 恢复job * * @throws SchedulerException */ public void resumeJob(Integer taskId) throws SchedulerException { QuartzVO quartzVO = this.generateQuartzVO(taskId); JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName()); scheduler.resumeJob(jobKey); } /** * 修改定时任务 * * @param */ public void updateJob(QrtzTaskDTO qrtzTask) { //更新任务 QuartzVO quartzVO = this.generateQuartzVO(qrtzTask.getId()); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("qrtzTask", qrtzTask); TriggerKey oldTriggerKey = TriggerKey.triggerKey(quartzVO.getTriggerName(), quartzVO.getTriggerGroupName()); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(qrtzTask.getCron()); CronTrigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity(oldTriggerKey).usingJobData(jobDataMap).withSchedule(scheduleBuilder).build(); try { scheduler.rescheduleJob(oldTriggerKey, cronTrigger); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 新增job任务 * * @throws SchedulerException */ @Transactional public void addJob(QrtzTaskDTO qrtzTask) throws SchedulerException { //添加一条任务记录 Class jobClass= null; try { jobClass = Class.forName(qrtzTask.getJobClass()); } catch (Exception e){ throw new BusinessException(ExceptionEnum.BUSINESS_ERROR,"未找到类"); } QuartzVO quartzVO = this.generateQuartzVO(qrtzTask.getId()); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("qrtzTask", qrtzTask); CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(qrtzTask.getCron()); JobDetail jobDetail = JobBuilder .newJob(jobClass) .withIdentity(quartzVO.getJobName(), quartzVO.getJobGroupName()) .build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity(quartzVO.getTriggerName(), quartzVO.getTriggerGroupName()) .withSchedule(cronScheduleBuilder) .usingJobData(jobDataMap) .build(); scheduler.scheduleJob(jobDetail, trigger); } public QuartzVO generateQuartzVO(Integer taskId) { QuartzVO quartzVO = new QuartzVO(); quartzVO.setJobName("Job_" + taskId); quartzVO.setJobGroupName("Default"); quartzVO.setTriggerName("Trigger_" + taskId); quartzVO.setTriggerGroupName("Default"); return quartzVO; } /** * 停止正在进行的job * * @throws SchedulerException */ public void interruptJob(Integer taskId) throws SchedulerException { QuartzVO quartzVO = this.generateQuartzVO(taskId); JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName()); scheduler.interrupt(jobKey); } }