# 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)