初始化 Quartz 的整体代码

This commit is contained in:
YunaiV
2021-02-13 22:52:42 +08:00
parent c807de1ff8
commit dadb66c8e9
8 changed files with 364 additions and 168 deletions

View File

@ -0,0 +1,12 @@
package cn.iocoder.dashboard.framework.quartz.core.enums;
/**
* Quartz Job Data 的 key 枚举
*/
public enum JobDataKeyEnum {
JOB_ID,
JOB_HANDLER_NAME,
JOB_HANDLER_PARAM
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.dashboard.framework.quartz.core.handler;
import cn.iocoder.dashboard.common.pojo.CommonResult;
/**
* 任务处理器
*
* @author 芋道源码
*/
public interface JobHandler {
/**
* 执行任务
*
* @param param 参数
* @return 结果
* @throws Exception 异常
*/
CommonResult<String> execute(String param) throws Exception;
}

View File

@ -0,0 +1,49 @@
package cn.iocoder.dashboard.framework.quartz.core.handler;
import cn.iocoder.dashboard.framework.quartz.core.enums.JobDataKeyEnum;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import javax.annotation.Resource;
/**
* 基础 Job 调用者,负责调用 {@link JobHandler#execute(String)} 执行任务
*
* @author 芋道源码
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class JobHandlerInvoker extends QuartzJobBean {
@Resource
private ApplicationContext applicationContext;
@Override
protected void executeInternal(JobExecutionContext executionContext) {
// 获得 JobHandler 对象
String jobHandlerName = getJobData(executionContext, JobDataKeyEnum.JOB_HANDLER_NAME);
JobHandler jobHandler = applicationContext.getBean(jobHandlerName, JobHandler.class);
// 执行任务
String jobParam = getJobData(executionContext, JobDataKeyEnum.JOB_HANDLER_PARAM);
try {
jobHandler.execute(jobParam);
} catch (Exception e) {
// TODO 需要后续处理
}
}
@SuppressWarnings("SwitchStatementWithTooFewBranches")
private static String getJobData(JobExecutionContext executionContext, JobDataKeyEnum key) {
switch (key) {
case JOB_ID:
return executionContext.getJobDetail().getJobDataMap().getString(key.name());
default:
return executionContext.getTrigger().getJobDataMap().getString(key.name());
}
}
}

View File

@ -0,0 +1,75 @@
package cn.iocoder.dashboard.framework.quartz.core.scheduler;
import cn.iocoder.dashboard.framework.quartz.core.enums.JobDataKeyEnum;
import cn.iocoder.dashboard.framework.quartz.core.handler.JobHandlerInvoker;
import org.quartz.*;
/**
* {@link org.quartz.Scheduler} 的管理器,负责创建任务
*
* @author 芋道源码
*/
public class SchedulerManager {
private final Scheduler scheduler;
public SchedulerManager(Scheduler scheduler) {
this.scheduler = scheduler;
}
public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam,
String triggerName, String cronExpression)
throws SchedulerException {
// 创建 JobDetail 对象
JobDetail jobDetail = JobBuilder.newJob(JobHandlerInvoker.class)
.usingJobData(JobDataKeyEnum.JOB_ID.name(), jobId)
.withIdentity(jobHandlerName).build();
// 创建 Trigger 对象
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName)
.usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName)
.usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
// 新增调度
scheduler.scheduleJob(jobDetail, trigger);
}
public void updateJob(String jobHandlerName, String jobHandlerParam,
String triggerName, String cronExpression) throws SchedulerException {
// 创建 Trigger 对象
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName)
.usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName)
.usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
// 修改调度
scheduler.rescheduleJob(new TriggerKey(triggerName), trigger);
}
public void deleteJob(String jobHandlerName) throws SchedulerException {
scheduler.deleteJob(new JobKey(jobHandlerName));
}
public void pauseJob(String jobHandlerName) throws SchedulerException {
scheduler.pauseJob(new JobKey(jobHandlerName));
}
public void resumeJob(String jobHandlerName,
String triggerName) throws SchedulerException {
scheduler.resumeJob(new JobKey(jobHandlerName));
scheduler.resumeTrigger(new TriggerKey(triggerName));
}
public void triggerJob(Long jobId, String jobHandlerName, String jobHandlerParam)
throws SchedulerException {
JobDataMap data = new JobDataMap();
data.put(JobDataKeyEnum.JOB_ID.name(), jobId);
data.put(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName);
data.put(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam);
// 触发任务
scheduler.triggerJob(new JobKey(jobHandlerName), data);
}
}

View File

@ -12,7 +12,7 @@ import lombok.ToString;
import java.util.Date;
/**
* 定时任务
* 定时任务 DO
*
* @author 芋道源码
*/
@ -20,7 +20,7 @@ import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJob extends BaseDO {
public class InfJobDO extends BaseDO {
/**
* 任务编号

View File

@ -18,7 +18,7 @@ import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobLog extends BaseDO {
public class InfJobLogDO extends BaseDO {
/**
* 日志编号
@ -27,31 +27,31 @@ public class InfJobLog extends BaseDO {
/**
* 任务编号
*
* 关联 {@link InfJob#getId()}
* 关联 {@link InfJobDO#getId()}
*/
private Long jobId;
/**
* 任务名称
*
* 冗余字段 {@link InfJob#getName()}
* 冗余字段 {@link InfJobDO#getName()}
*/
private String jobName;
/**
* 任务分组
*
* 冗余字段 {@link InfJob#getGroup()}
* 冗余字段 {@link InfJobDO#getGroup()}
*/
private String jobGroup;
/**
* 处理器的名字
*
* 冗余字段 {@link InfJob#getHandlerName()}
* 冗余字段 {@link InfJobDO#getHandlerName()}
*/
private String handlerName;
/**
* 处理器的参数
*
* 冗余字段 {@link InfJob#getHandlerParam()}
* 冗余字段 {@link InfJobDO#getHandlerParam()}
*/
private String handlerParam;
@ -82,7 +82,7 @@ public class InfJobLog extends BaseDO {
/**
* 结果数据
*
* 如果是对象则使用 JSON 格式化
* 目前使用的 {@link CommonResult#getData()} 数据
*/
private String resultData;