package com.project.quartz.util; import com.project.quartz.domain.SysJobDelay; import com.project.quartz.service.ISysJobDelayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; import java.util.Map; import static com.project.common.constant.ScheduleConstants.ORDER_CANCEL; @Slf4j @Component @RequiredArgsConstructor(onConstructor_ = @Autowired) public class DelayScheduleUtils { private final ISysJobDelayService delayService; private final Scheduler scheduler; private static final String JOB_GROUP_NAME = "DEFAULT_JOB_GROUP_NAME"; private static final String TRIGGER_GROUP_NAME = "DEFAULT_TRIGGER_GROUP_NAME"; /** * addSimpleJob简略版有额外参数 * * @param jobName 任务名称 * @param startTime 执行时间 * @param extraParam 额外参数 * @param jobClass 任务类 */ public void addSimpleJob(String jobName, Date startTime, Map extraParam, Class jobClass) { addSimpleJob(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, startTime, extraParam, jobClass); } /** * 添加简单定时任务 */ public void addSimpleJob(String jobName, String jobGroup, String triggerName, String triggerGroup, Date startTime, Map extraParam, Class jobClass) { try { JobDetail jobDetail = JobBuilder .newJob(jobClass) .withIdentity(jobName, jobGroup) .build(); if (extraParam != null) { jobDetail.getJobDataMap().putAll(extraParam); } SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder .newTrigger() .withIdentity(triggerName, triggerGroup) .startAt(startTime) .build(); scheduler.scheduleJob(jobDetail, simpleTrigger); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 删除单个任务 */ public void deleteJob(String orderNo) { //取消延时任务 delayService.remove(delayService.lq().eq(SysJobDelay::getJobOrder,orderNo)); try { scheduler.pauseTrigger(TriggerKey.triggerKey(ORDER_CANCEL+orderNo, TRIGGER_GROUP_NAME));// 停止触发器 scheduler.unscheduleJob(TriggerKey.triggerKey(ORDER_CANCEL+orderNo, TRIGGER_GROUP_NAME));// 移除触发器 scheduler.deleteJob(JobKey.jobKey(ORDER_CANCEL+orderNo, JOB_GROUP_NAME));// 删除任务 } catch (Exception e) { throw new RuntimeException(e); } } }