mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +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