mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-13 18:45:06 +08:00
初始化 Quartz 的整体代码
This commit is contained in:
@ -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
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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 {
|
||||
|
||||
/**
|
||||
* 任务编号
|
@ -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;
|
||||
|
@ -42,6 +42,35 @@ spring:
|
||||
# main:
|
||||
# lazy-initialization: true # TODO 芋艿:本地开发环境,可以配置下 lazy 延迟加载
|
||||
|
||||
# Quartz 配置项,对应 QuartzProperties 配置类
|
||||
quartz:
|
||||
scheduler-name: clusteredScheduler # Scheduler 名字。默认为 schedulerName
|
||||
job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
|
||||
auto-startup: true # Quartz 是否自动启动
|
||||
startup-delay: 0 # 延迟 N 秒启动
|
||||
wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
|
||||
overwrite-existing-jobs: false # 是否覆盖已有 Job 的配置
|
||||
properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
|
||||
org:
|
||||
quartz:
|
||||
# JobStore 相关配置
|
||||
jobStore:
|
||||
# 数据源名称
|
||||
# dataSource: quartzDataSource # 使用的数据源 TODO 使用默认数据源
|
||||
class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类
|
||||
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
|
||||
tablePrefix: QRTZ_ # Quartz 表前缀
|
||||
isClustered: true # 是集群模式
|
||||
clusterCheckinInterval: 1000
|
||||
useProperties: false
|
||||
# 线程池相关配置
|
||||
threadPool:
|
||||
threadCount: 25 # 线程池大小。默认为 10 。
|
||||
threadPriority: 5 # 线程优先级
|
||||
class: org.quartz.simpl.SimpleThreadPool # 线程池类型
|
||||
jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
|
||||
initialize-schema: never # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
|
||||
|
||||
# 芋道配置项,设置当前项目所有自定义的配置
|
||||
yudao:
|
||||
info:
|
||||
|
Reference in New Issue
Block a user