mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	1. 完成 Job 的 CRUD 功能
This commit is contained in:
		@@ -0,0 +1,48 @@
 | 
			
		||||
package com.ruoyi.quartz.config;
 | 
			
		||||
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 | 
			
		||||
 | 
			
		||||
import javax.sql.DataSource;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 定时任务配置
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class ScheduleConfig {
 | 
			
		||||
 | 
			
		||||
    @Bean
 | 
			
		||||
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
 | 
			
		||||
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
 | 
			
		||||
        factory.setDataSource(dataSource);
 | 
			
		||||
 | 
			
		||||
        // quartz参数
 | 
			
		||||
        Properties prop = new Properties();
 | 
			
		||||
        prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
 | 
			
		||||
        prop.put("org.quartz.scheduler.instanceId", "AUTO");
 | 
			
		||||
        // 集群配置
 | 
			
		||||
        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
 | 
			
		||||
        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
 | 
			
		||||
        prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
 | 
			
		||||
 | 
			
		||||
        // sqlserver 启用
 | 
			
		||||
        // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
 | 
			
		||||
        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
 | 
			
		||||
        factory.setQuartzProperties(prop);
 | 
			
		||||
 | 
			
		||||
        factory.setSchedulerName("RuoyiScheduler");
 | 
			
		||||
        // 延时启动
 | 
			
		||||
        factory.setStartupDelay(1);
 | 
			
		||||
        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
 | 
			
		||||
        // 可选,QuartzScheduler
 | 
			
		||||
        // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
 | 
			
		||||
        factory.setOverwriteExistingJobs(true);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        return factory;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,64 @@
 | 
			
		||||
package com.ruoyi.quartz.controller;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.security.access.prepost.PreAuthorize;
 | 
			
		||||
import org.springframework.web.bind.annotation.DeleteMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.PathVariable;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
import com.ruoyi.common.annotation.Log;
 | 
			
		||||
import com.ruoyi.common.core.controller.BaseController;
 | 
			
		||||
import com.ruoyi.common.core.domain.AjaxResult;
 | 
			
		||||
import com.ruoyi.common.core.page.TableDataInfo;
 | 
			
		||||
import com.ruoyi.common.enums.BusinessType;
 | 
			
		||||
import com.ruoyi.common.utils.poi.ExcelUtil;
 | 
			
		||||
import com.ruoyi.quartz.domain.SysJobLog;
 | 
			
		||||
import com.ruoyi.quartz.service.ISysJobLogService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 调度日志操作处理
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/monitor/jobLog")
 | 
			
		||||
public class SysJobLogController extends BaseController {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private ISysJobLogService jobLogService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询定时任务调度日志列表
 | 
			
		||||
     */
 | 
			
		||||
    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
 | 
			
		||||
    @GetMapping("/list")
 | 
			
		||||
    public TableDataInfo list(SysJobLog sysJobLog) {
 | 
			
		||||
        startPage();
 | 
			
		||||
        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
 | 
			
		||||
        return getDataTable(list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 导出定时任务调度日志列表
 | 
			
		||||
     */
 | 
			
		||||
    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
 | 
			
		||||
    @Log(title = "任务调度日志", businessType = BusinessType.EXPORT)
 | 
			
		||||
    @GetMapping("/export")
 | 
			
		||||
    public AjaxResult export(SysJobLog sysJobLog) {
 | 
			
		||||
        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
 | 
			
		||||
        ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
 | 
			
		||||
        return util.exportExcel(list, "调度日志");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据调度编号获取详细信息
 | 
			
		||||
     */
 | 
			
		||||
    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
 | 
			
		||||
    @GetMapping(value = "/{configId}")
 | 
			
		||||
    public AjaxResult getInfo(@PathVariable Long jobLogId) {
 | 
			
		||||
        return AjaxResult.success(jobLogService.selectJobLogById(jobLogId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,54 @@
 | 
			
		||||
package com.ruoyi.quartz.service.impl;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import com.ruoyi.quartz.domain.SysJobLog;
 | 
			
		||||
import com.ruoyi.quartz.mapper.SysJobLogMapper;
 | 
			
		||||
import com.ruoyi.quartz.service.ISysJobLogService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 定时任务调度日志信息 服务层
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class SysJobLogServiceImpl implements ISysJobLogService {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private SysJobLogMapper jobLogMapper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取quartz调度器日志的计划任务
 | 
			
		||||
     *
 | 
			
		||||
     * @param jobLog 调度日志信息
 | 
			
		||||
     * @return 调度任务日志集合
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<SysJobLog> selectJobLogList(SysJobLog jobLog) {
 | 
			
		||||
        return jobLogMapper.selectJobLogList(jobLog);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过调度任务日志ID查询调度信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param jobLogId 调度任务日志ID
 | 
			
		||||
     * @return 调度任务日志对象信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public SysJobLog selectJobLogById(Long jobLogId) {
 | 
			
		||||
        return jobLogMapper.selectJobLogById(jobLogId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增任务日志
 | 
			
		||||
     *
 | 
			
		||||
     * @param jobLog 调度日志信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void addJobLog(SysJobLog jobLog) {
 | 
			
		||||
        jobLogMapper.insertJobLog(jobLog);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,97 @@
 | 
			
		||||
package com.ruoyi.quartz.util;
 | 
			
		||||
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
import org.quartz.Job;
 | 
			
		||||
import org.quartz.JobExecutionContext;
 | 
			
		||||
import org.quartz.JobExecutionException;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import com.ruoyi.common.constant.Constants;
 | 
			
		||||
import com.ruoyi.common.constant.ScheduleConstants;
 | 
			
		||||
import com.ruoyi.common.utils.ExceptionUtil;
 | 
			
		||||
import com.ruoyi.common.utils.StringUtils;
 | 
			
		||||
import com.ruoyi.common.utils.bean.BeanUtils;
 | 
			
		||||
import com.ruoyi.common.utils.spring.SpringUtils;
 | 
			
		||||
import com.ruoyi.quartz.domain.SysJob;
 | 
			
		||||
import com.ruoyi.quartz.domain.SysJobLog;
 | 
			
		||||
import com.ruoyi.quartz.service.ISysJobLogService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 抽象quartz调用
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractQuartzJob implements Job {
 | 
			
		||||
    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 线程本地变量
 | 
			
		||||
     */
 | 
			
		||||
    private static ThreadLocal<Date> threadLocal = new ThreadLocal<>();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void execute(JobExecutionContext context) throws JobExecutionException {
 | 
			
		||||
        SysJob sysJob = new SysJob();
 | 
			
		||||
        BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
 | 
			
		||||
        try {
 | 
			
		||||
            before(context, sysJob);
 | 
			
		||||
            if (sysJob != null) {
 | 
			
		||||
                doExecute(context, sysJob);
 | 
			
		||||
            }
 | 
			
		||||
            after(context, sysJob, null);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            log.error("任务执行异常  - :", e);
 | 
			
		||||
            after(context, sysJob, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 执行前
 | 
			
		||||
     *
 | 
			
		||||
     * @param context 工作执行上下文对象
 | 
			
		||||
     * @param sysJob  系统计划任务
 | 
			
		||||
     */
 | 
			
		||||
    protected void before(JobExecutionContext context, SysJob sysJob) {
 | 
			
		||||
        threadLocal.set(new Date());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 执行后
 | 
			
		||||
     *
 | 
			
		||||
     * @param context 工作执行上下文对象
 | 
			
		||||
     * @param sysJob  系统计划任务
 | 
			
		||||
     */
 | 
			
		||||
    protected void after(JobExecutionContext context, SysJob sysJob, Exception e) {
 | 
			
		||||
        Date startTime = threadLocal.get();
 | 
			
		||||
        threadLocal.remove();
 | 
			
		||||
 | 
			
		||||
        final SysJobLog sysJobLog = new SysJobLog();
 | 
			
		||||
        sysJobLog.setJobName(sysJob.getJobName());
 | 
			
		||||
        sysJobLog.setJobGroup(sysJob.getJobGroup());
 | 
			
		||||
        sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
 | 
			
		||||
        sysJobLog.setStartTime(startTime);
 | 
			
		||||
        sysJobLog.setStopTime(new Date());
 | 
			
		||||
        long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime();
 | 
			
		||||
        sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒");
 | 
			
		||||
        if (e != null) {
 | 
			
		||||
            sysJobLog.setStatus(Constants.FAIL);
 | 
			
		||||
            String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
 | 
			
		||||
            sysJobLog.setExceptionInfo(errorMsg);
 | 
			
		||||
        } else {
 | 
			
		||||
            sysJobLog.setStatus(Constants.SUCCESS);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 写入数据库当中
 | 
			
		||||
        SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 执行方法,由子类重载
 | 
			
		||||
     *
 | 
			
		||||
     * @param context 工作执行上下文对象
 | 
			
		||||
     * @param sysJob  系统计划任务
 | 
			
		||||
     * @throws Exception 执行过程中的异常
 | 
			
		||||
     */
 | 
			
		||||
    protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
package com.ruoyi.quartz.util;
 | 
			
		||||
 | 
			
		||||
import org.quartz.CronScheduleBuilder;
 | 
			
		||||
import org.quartz.CronTrigger;
 | 
			
		||||
import org.quartz.Job;
 | 
			
		||||
import org.quartz.JobBuilder;
 | 
			
		||||
import org.quartz.JobDetail;
 | 
			
		||||
import org.quartz.JobKey;
 | 
			
		||||
import org.quartz.Scheduler;
 | 
			
		||||
import org.quartz.SchedulerException;
 | 
			
		||||
import org.quartz.TriggerBuilder;
 | 
			
		||||
import org.quartz.TriggerKey;
 | 
			
		||||
import com.ruoyi.common.constant.ScheduleConstants;
 | 
			
		||||
import com.ruoyi.common.exception.job.TaskException;
 | 
			
		||||
import com.ruoyi.common.exception.job.TaskException.Code;
 | 
			
		||||
import com.ruoyi.quartz.domain.SysJob;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 定时任务工具类
 | 
			
		||||
 *
 | 
			
		||||
 * @author ruoyi
 | 
			
		||||
 */
 | 
			
		||||
public class ScheduleUtils {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 设置定时任务策略
 | 
			
		||||
     */
 | 
			
		||||
    public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb)
 | 
			
		||||
            throws TaskException {
 | 
			
		||||
        switch (job.getMisfirePolicy()) {
 | 
			
		||||
            case ScheduleConstants.MISFIRE_DEFAULT:
 | 
			
		||||
                return cb;
 | 
			
		||||
            case ScheduleConstants.MISFIRE_IGNORE_MISFIRES:
 | 
			
		||||
                return cb.withMisfireHandlingInstructionIgnoreMisfires();
 | 
			
		||||
            case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED:
 | 
			
		||||
                return cb.withMisfireHandlingInstructionFireAndProceed();
 | 
			
		||||
            case ScheduleConstants.MISFIRE_DO_NOTHING:
 | 
			
		||||
                return cb.withMisfireHandlingInstructionDoNothing();
 | 
			
		||||
            default:
 | 
			
		||||
                throw new TaskException("The task misfire policy '" + job.getMisfirePolicy()
 | 
			
		||||
                        + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user