# springboot-quartz **Repository Path**: Mzhoulee/springboot-quartz ## Basic Information - **Project Name**: springboot-quartz - **Description**: 基于springboot+quartz+mybatis-plus的定时任务调度 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 3 - **Created**: 2020-07-27 - **Last Updated**: 2022-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- title: Quartz定时任务调度的使用及相关工具 date: 2020-08-31 tags: - springboot - quartz categories: - Quartz author: lmz --- # springboot-quartz #### 介绍 基于springboot+quartz+mybatis-plus的定时任务调度 通过框架Quartz实现定时任务的新增,删除,更新,暂停,恢复等操作 #### 创建定时任务 1. 数据库,详情请见项目中resources的sql文件 2. pom文件依赖 ```maven org.springframework.boot spring-boot-starter-quartz ``` 3. 定时任务工具类,核心 ```java public class ScheduleUtils { private final static String JOB_NAME = "TASK_"; /** * 获取触发器key */ public static TriggerKey getTriggerKey(Long jobId) { return TriggerKey.triggerKey(JOB_NAME + jobId); } /** * 获取jobKey */ public static JobKey getJobKey(Long jobId) { return JobKey.jobKey(JOB_NAME + jobId); } /** * 获取表达式触发器 */ public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) { try { return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId)); } catch (SchedulerException e) { return null; } } /** * 创建定时任务 */ public static void createScheduleJob(Scheduler scheduler, QuartzEntity scheduleJob) { try { //构建job信息 JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build(); //表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) .withMisfireHandlingInstructionDoNothing(); //按新的cronExpression表达式构建一个新的trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build(); //放入参数,运行时的方法可以获取 jobDetail.getJobDataMap().put(QuartzEntity.JOB_PARAM_KEY, scheduleJob); scheduler.scheduleJob(jobDetail, trigger); //暂停任务 if (scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()) { pauseJob(scheduler, scheduleJob.getJobId()); } //执行调度器 scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 更新定时任务 */ public static void updateScheduleJob(Scheduler scheduler, QuartzEntity scheduleJob) { try { TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId()); //表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) .withMisfireHandlingInstructionDoNothing(); CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId()); //按新的cronExpression表达式重新构建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); //参数 trigger.getJobDataMap().put(QuartzEntity.JOB_PARAM_KEY, scheduleJob); scheduler.rescheduleJob(triggerKey, trigger); //暂停任务 if (scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()) { pauseJob(scheduler, scheduleJob.getJobId()); } } catch (SchedulerException e) { e.printStackTrace(); } } /** * 立即执行任务 */ public static void run(Scheduler scheduler, QuartzEntity scheduleJob) { try { //参数 JobDataMap dataMap = new JobDataMap(); dataMap.put(QuartzEntity.JOB_PARAM_KEY, scheduleJob); scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 暂停任务 */ public static void pauseJob(Scheduler scheduler, Long jobId) { try { scheduler.pauseJob(getJobKey(jobId)); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 恢复任务 */ public static void resumeJob(Scheduler scheduler, Long jobId) { try { scheduler.resumeJob(getJobKey(jobId)); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 删除定时任务 */ public static void deleteScheduleJob(Scheduler scheduler, Long jobId) { try { scheduler.deleteJob(getJobKey(jobId)); } catch (SchedulerException e) { e.printStackTrace(); } } } ``` 4. 定时任务执行,核心 继承Quartz的QuartzJobBean,来实现方法的执行 ```java public class ScheduleJob extends QuartzJobBean { private final Logger logger = LoggerFactory.getLogger(getClass()); @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { QuartzEntity scheduleJob = (QuartzEntity) context.getMergedJobDataMap() .get(QuartzEntity.JOB_PARAM_KEY); //任务开始时间 long startTime = System.currentTimeMillis(); try { //执行任务 logger.info("任务准备执行,任务ID:" + scheduleJob.getJobId()); //获取java类对象 Object target = SpringContextUtils.getBean(scheduleJob.getBeanName()); //获取执行方法 Method method = target.getClass().getDeclaredMethod("run", String.class); method.setAccessible(true); //执行 method.invoke(target, scheduleJob.getParams()); //任务执行总时长 long times = System.currentTimeMillis() - startTime; logger.info("任务执行完毕,任务ID:" + scheduleJob.getJobId() + " 总共耗时:" + times + "毫秒"); } catch (Exception e) { logger.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e); } } } ``` 5. 项目启动时初始化定时器 ```text private final Scheduler scheduler; @PostConstruct public void init() { List scheduleJobList = this.list(); for (QuartzEntity scheduleJob : scheduleJobList) { CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId()); //如果不存在,则创建 if (cronTrigger == null) { ScheduleUtils.createScheduleJob(scheduler, scheduleJob); } else { ScheduleUtils.updateScheduleJob(scheduler, scheduleJob); } } } ``` #### 码云地址[Quartz](https://gitee.com/Mzhoulee/springboot-quartz.git)