package cn.stylefeng.guns.modular.zsx.bs.job.quartz; import cn.stylefeng.guns.modular.zsx.bs.job.constant.QuartzEnum; import cn.stylefeng.guns.modular.zsx.bs.job.entity.SysJob; import lombok.SneakyThrows; import org.quartz.*; import org.springframework.util.ObjectUtils; import java.util.Date; /** * @author fulin * @since 2023/6/14 15:23 *
* 此类作为操作job的工具类,这里的job与quartz中的 JobDetail一一对应 ,包括任务的增删改 {@link JobDetail} *
*/ public class QuartzUtil { /** * 将新增的任务放入quartz调度中心中执行 * * @param sysJob 具体任务信息 * @throws Exception 异常 */ @SneakyThrows public static void insertOrUpdateJob(SysJob sysJob) { // 获取调度器 Scheduler Scheduler scheduler = SchedulerStatic.getScheduler(); Long jobId = sysJob.getId(); String jobGroup = sysJob.getJobGroup(); // 构造一个job JobKey jobKey = JobKey.jobKey(jobId.toString(), jobGroup); JobDetail jobDetail = JobBuilder .newJob(QuartzJob.class) .withIdentity(jobKey) .build(); // 构造cron调度器 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(sysJob.getCronExpression()); getMisfirePolicy(sysJob, cronScheduleBuilder); // 构造触发器 trigger TriggerKey triggerKey = TriggerKey.triggerKey(jobId.toString(), jobGroup); CronTrigger trigger = TriggerBuilder .newTrigger() .withIdentity(triggerKey) .withSchedule(cronScheduleBuilder) .build(); // 放入job信息,为后续执行改任务的具体方法做铺垫(需要反射调用), 在execute中获取并应用 jobDetail.getJobDataMap().put(QuartzEnum.jobKey, sysJob); // 判断该任务是否存在,修改任务,先删除然后添加 if (scheduler.checkExists(jobKey)) { // 防止创建时存在数据问题 先移除,然后在执行创建操作 scheduler.deleteJob(jobKey); } // 判断任务是否过期 CronExpression cron = new CronExpression(sysJob.getCronExpression()); Date nextValidTimeAfter = cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); if (!ObjectUtils.isEmpty(nextValidTimeAfter)) { // 执行调度任务 scheduler.scheduleJob(jobDetail, trigger); } // 暂停任务 if (sysJob.getStatus().equals(QuartzEnum.PAUSE)) { scheduler.pauseJob(jobKey); } } /** * 根据计划执行错误策略,设置调度器 * * @param sysJob 任务信息 * @param cronScheduleBuilder cron调度器 */ private static void getMisfirePolicy(SysJob sysJob, CronScheduleBuilder cronScheduleBuilder) { switch (sysJob.getMisfirePolicy()) { case QuartzEnum.MISFIRE_DEFAULT: break; case QuartzEnum.MISFIRE_IGNORE_MISFIRES: cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires(); break; case QuartzEnum.MISFIRE_FIRE_AND_PROCEED: cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed(); break; case QuartzEnum.MISFIRE_DO_NOTHING: cronScheduleBuilder.withMisfireHandlingInstructionDoNothing(); break; default: throw new RuntimeException("The task misfire policy '" + sysJob.getMisfirePolicy() + "' cannot be used in cron schedule tasks"); } } /** * 删除任务 * * @param sysJob 具体任务信息(获取jobkey) */ @SneakyThrows public static void deleteJob(SysJob sysJob) { // 获取调度器 Scheduler Scheduler scheduler = SchedulerStatic.getScheduler(); scheduler.deleteJob(JobKey.jobKey(sysJob.getId().toString(), sysJob.getJobGroup())); } }