ruoyi後臺管理系統分析(五)---quartz包

5、quartz包java

(Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它能夠與J2EE與J2SE應用程序相結合也能夠單獨使用。)spring

--config包sql

ScheduleConfig.java-----定時任務配置
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.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); prop.put("org.quartz.threadPool.threadCount", "20"); prop.put("org.quartz.threadPool.threadPriority", "5"); // JobStore配置
        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); // 集羣配置
        prop.put("org.quartz.jobStore.isClustered", "true"); 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"); prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); factory.setQuartzProperties(prop); factory.setSchedulerName("RuoyiScheduler"); // 延時啓動
        factory.setStartupDelay(1); factory.setApplicationContextSchedulerContextKey("applicationContextKey"); // 可選,QuartzScheduler // 啓動時更新己存在的Job,這樣就不用每次修改targetObject後刪除qrtz_job_details表對應記錄了
        factory.setOverwriteExistingJobs(true); // 設置自動啓動,默認爲true
        factory.setAutoStartup(true); return factory; } }
View Code

--domain包apache

SysJob.java-------定時任務調度表 sys_job
package com.ruoyi.quartz.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.io.Serializable; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.base.BaseEntity; import com.ruoyi.common.constant.ScheduleConstants; /** * 定時任務調度表 sys_job * * @author ruoyi */
public class SysJob extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; /** 任務ID */ @Excel(name = "任務序號") private Long jobId; /** 任務名稱 */ @Excel(name = "任務名稱") private String jobName; /** 任務組名 */ @Excel(name = "任務組名") private String jobGroup; /** 任務方法 */ @Excel(name = "任務方法") private String methodName; /** 方法參數 */ @Excel(name = "方法參數") private String methodParams; /** cron執行表達式 */ @Excel(name = "執行表達式 ") private String cronExpression; /** cron計劃策略 */ @Excel(name = "計劃策略 ") private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; /** 任務狀態(0正常 1暫停) */ @Excel(name = "任務狀態") private String status; public Long getJobId() { return jobId; } public void setJobId(Long jobId) { this.jobId = jobId; } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public String getJobGroup() { return jobGroup; } public void setJobGroup(String jobGroup) { this.jobGroup = jobGroup; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getMethodParams() { return methodParams; } public void setMethodParams(String methodParams) { this.methodParams = methodParams; } public String getCronExpression() { return cronExpression; } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public String getMisfirePolicy() { return misfirePolicy; } public void setMisfirePolicy(String misfirePolicy) { this.misfirePolicy = misfirePolicy; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("jobId", getJobId()) .append("jobName", getJobName()) .append("jobGroup", getJobGroup()) .append("methodName", getMethodName()) .append("methodParams", getMethodParams()) .append("cronExpression", getCronExpression()) .append("misfirePolicy", getMisfirePolicy()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); } }
View Code
SysJobLog.java-----定時任務調度日誌表 sys_job_log
private static final long serialVersionUID = 1L; /** ID */ @Excel(name = "日誌序號") private Long jobLogId; /** 任務名稱 */ @Excel(name = "任務名稱") private String jobName; /** 任務組名 */ @Excel(name = "任務組名") private String jobGroup; /** 任務方法 */ @Excel(name = "任務方法") private String methodName; /** 方法參數 */ @Excel(name = "方法參數") private String methodParams; /** 日誌信息 */ @Excel(name = "日誌信息") private String jobMessage; /** 執行狀態(0正常 1失敗) */ @Excel(name = "執行狀態") private String status; /** 異常信息 */ @Excel(name = "異常信息") private String exceptionInfo; public Long getJobLogId() { return jobLogId; } public void setJobLogId(Long jobLogId) { this.jobLogId = jobLogId; } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public String getJobGroup() { return jobGroup; } public void setJobGroup(String jobGroup) { this.jobGroup = jobGroup; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getMethodParams() { return methodParams; } public void setMethodParams(String methodParams) { this.methodParams = methodParams; } public String getJobMessage() { return jobMessage; } public void setJobMessage(String jobMessage) { this.jobMessage = jobMessage; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getExceptionInfo() { return exceptionInfo; } public void setExceptionInfo(String exceptionInfo) { this.exceptionInfo = exceptionInfo; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("jobLogId", getJobLogId()) .append("jobName", getJobName()) .append("jobGroup", getJobGroup()) .append("methodName", getMethodName()) .append("methodParams", getMethodParams()) .append("jobMessage", getJobMessage()) .append("status", getStatus()) .append("exceptionInfo", getExceptionInfo()) .append("createTime", getCreateTime()) .toString(); }
View Code

--mapper包app

SysJobLogMapper.java------調度任務日誌信息 數據層
package com.ruoyi.quartz.mapper; import java.util.List; import com.ruoyi.quartz.domain.SysJobLog; /** * 調度任務日誌信息 數據層 * * @author ruoyi */
public interface SysJobLogMapper { /** * 獲取quartz調度器日誌的計劃任務 * * @param jobLog 調度日誌信息 * @return 調度任務日誌集合 */
    public List<SysJobLog> selectJobLogList(SysJobLog jobLog); /** * 經過調度任務日誌ID查詢調度信息 * * @param jobLogId 調度任務日誌ID * @return 調度任務日誌對象信息 */
    public SysJobLog selectJobLogById(Long jobLogId); /** * 新增任務日誌 * * @param jobLog 調度日誌信息 * @return 結果 */
    public int insertJobLog(SysJobLog jobLog); /** * 批量刪除調度日誌信息 * * @param ids 須要刪除的數據ID * @return 結果 */
    public int deleteJobLogByIds(String[] ids); /** * 刪除任務日誌 * * @param jobId 調度日誌ID * @return 結果 */
    public int deleteJobLogById(Long jobId); /** * 清空任務日誌 */
    public void cleanJobLog(); }
View Code
SysJobMapper.java-----調度任務信息  數據層
package com.ruoyi.quartz.mapper; import java.util.List; import com.ruoyi.quartz.domain.SysJob; /** * 調度任務信息 數據層 * * @author ruoyi */
public interface SysJobMapper { /** * 查詢調度任務日誌集合 * * @param job 調度信息 * @return 操做日誌集合 */
    public List<SysJob> selectJobList(SysJob job); /** * 查詢全部調度任務 * * @return 調度任務列表 */
    public List<SysJob> selectJobAll(); /** * 經過調度ID查詢調度任務信息 * * @param jobId 調度ID * @return 角色對象信息 */
    public SysJob selectJobById(Long jobId); /** * 經過調度ID刪除調度任務信息 * * @param jobId 調度ID * @return 結果 */
    public int deleteJobById(SysJob job); /** * 批量刪除調度任務信息 * * @param ids 須要刪除的數據ID * @return 結果 */
    public int deleteJobLogByIds(Long[] ids); /** * 修改調度任務信息 * * @param job 調度任務信息 * @return 結果 */
    public int updateJob(SysJob job); /** * 新增調度任務信息 * * @param job 調度任務信息 * @return 結果 */
    public int insertJob(SysJob job); }
View Code

--service包
ISysJobLogService.java----定時任務調度日誌信息  服務層
package com.ruoyi.quartz.service; import java.util.List; import com.ruoyi.quartz.domain.SysJobLog; /** * 定時任務調度日誌信息 服務層 * * @author ruoyi */
public interface ISysJobLogService { /** * 獲取quartz調度器日誌的計劃任務 * * @param jobLog 調度日誌信息 * @return 調度任務日誌集合 */
    public List<SysJobLog> selectJobLogList(SysJobLog jobLog); /** * 經過調度任務日誌ID查詢調度信息 * * @param jobLogId 調度任務日誌ID * @return 調度任務日誌對象信息 */
    public SysJobLog selectJobLogById(Long jobLogId); /** * 新增任務日誌 * * @param jobLog 調度日誌信息 */
    public void addJobLog(SysJobLog jobLog); /** * 批量刪除調度日誌信息 * * @param ids 須要刪除的數據ID * @return 結果 */
    public int deleteJobLogByIds(String ids); /** * 刪除任務日誌 * * @param jobId 調度日誌ID * @return 結果 */
    public int deleteJobLogById(Long jobId); /** * 清空任務日誌 */
    public void cleanJobLog(); }
View Code
ISysJobService.java----定時任務調度信息 服務層
package com.ruoyi.quartz.service; import java.util.List; import com.ruoyi.quartz.domain.SysJob; /** * 定時任務調度信息 服務層 * * @author ruoyi */
public interface ISysJobService { /** * 獲取quartz調度器的計劃任務 * * @param job 調度信息 * @return 調度任務集合 */
    public List<SysJob> selectJobList(SysJob job); /** * 經過調度任務ID查詢調度信息 * * @param jobId 調度任務ID * @return 調度任務對象信息 */
    public SysJob selectJobById(Long jobId); /** * 暫停任務 * * @param job 調度信息 * @return 結果 */
    public int pauseJob(SysJob job); /** * 恢復任務 * * @param job 調度信息 * @return 結果 */
    public int resumeJob(SysJob job); /** * 刪除任務後,所對應的trigger也將被刪除 * * @param job 調度信息 * @return 結果 */
    public int deleteJob(SysJob job); /** * 批量刪除調度信息 * * @param ids 須要刪除的數據ID * @return 結果 */
    public void deleteJobByIds(String ids); /** * 任務調度狀態修改 * * @param job 調度信息 * @return 結果 */
    public int changeStatus(SysJob job); /** * 當即運行任務 * * @param job 調度信息 * @return 結果 */
    public int run(SysJob job); /** * 新增任務表達式 * * @param job 調度信息 * @return 結果 */
    public int insertJobCron(SysJob job); /** * 更新任務的時間表達式 * * @param job 調度信息 * @return 結果 */
    public int updateJobCron(SysJob job); }
View Code
SysJobLogServiceImpl.java-----定時任務調度日誌信息 服務層
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.common.support.Convert; 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 jobId 調度任務日誌ID * @return 調度任務日誌對象信息 */ @Override public SysJobLog selectJobLogById(Long jobLogId) { return jobLogMapper.selectJobLogById(jobLogId); } /** * 新增任務日誌 * * @param jobLog 調度日誌信息 */ @Override public void addJobLog(SysJobLog jobLog) { jobLogMapper.insertJobLog(jobLog); } /** * 批量刪除調度日誌信息 * * @param ids 須要刪除的數據ID * @return 結果 */ @Override public int deleteJobLogByIds(String ids) { return jobLogMapper.deleteJobLogByIds(Convert.toStrArray(ids)); } /** * 刪除任務日誌 * * @param jobId 調度日誌ID */ @Override public int deleteJobLogById(Long jobId) { return jobLogMapper.deleteJobLogById(jobId); } /** * 清空任務日誌 */ @Override public void cleanJobLog() { jobLogMapper.cleanJobLog(); } }
View Code
SysJobServiceImpl.java-----定時任務調度信息 服務層
package com.ruoyi.quartz.service.impl; import java.util.List; import javax.annotation.PostConstruct; import org.quartz.CronTrigger; import org.quartz.Scheduler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.constant.ScheduleConstants; import com.ruoyi.common.support.Convert; import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.mapper.SysJobMapper; import com.ruoyi.quartz.service.ISysJobService; import com.ruoyi.quartz.util.ScheduleUtils; /** * 定時任務調度信息 服務層 * * @author ruoyi */ @Service public class SysJobServiceImpl implements ISysJobService { @Autowired private Scheduler scheduler; @Autowired private SysJobMapper jobMapper; /** * 項目啓動時,初始化定時器 */ @PostConstruct public void init() { List<SysJob> jobList = jobMapper.selectJobAll(); for (SysJob job : jobList) { CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, job.getJobId()); // 若是不存在,則建立
            if (cronTrigger == null) { ScheduleUtils.createScheduleJob(scheduler, job); } else { ScheduleUtils.updateScheduleJob(scheduler, job); } } } /** * 獲取quartz調度器的計劃任務列表 * * @param job 調度信息 * @return
     */ @Override public List<SysJob> selectJobList(SysJob job) { return jobMapper.selectJobList(job); } /** * 經過調度任務ID查詢調度信息 * * @param jobId 調度任務ID * @return 調度任務對象信息 */ @Override public SysJob selectJobById(Long jobId) { return jobMapper.selectJobById(jobId); } /** * 暫停任務 * * @param job 調度信息 */ @Override public int pauseJob(SysJob job) { job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.updateJob(job); if (rows > 0) { ScheduleUtils.pauseJob(scheduler, job.getJobId()); } return rows; } /** * 恢復任務 * * @param job 調度信息 */ @Override public int resumeJob(SysJob job) { job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); int rows = jobMapper.updateJob(job); if (rows > 0) { ScheduleUtils.resumeJob(scheduler, job.getJobId()); } return rows; } /** * 刪除任務後,所對應的trigger也將被刪除 * * @param job 調度信息 */ @Override public int deleteJob(SysJob job) { int rows = jobMapper.deleteJobById(job); if (rows > 0) { ScheduleUtils.deleteScheduleJob(scheduler, job.getJobId()); } return rows; } /** * 批量刪除調度信息 * * @param ids 須要刪除的數據ID * @return 結果 */ @Override public void deleteJobByIds(String ids) { Long[] jobIds = Convert.toLongArray(ids); for (Long jobId : jobIds) { SysJob job = jobMapper.selectJobById(jobId); deleteJob(job); } } /** * 任務調度狀態修改 * * @param job 調度信息 */ @Override public int changeStatus(SysJob job) { int rows = 0; String status = job.getStatus(); if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) { rows = resumeJob(job); } else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) { rows = pauseJob(job); } return rows; } /** * 當即運行任務 * * @param job 調度信息 */ @Override public int run(SysJob job) { return ScheduleUtils.run(scheduler, selectJobById(job.getJobId())); } /** * 新增任務 * * @param job 調度信息 調度信息 */ @Override public int insertJobCron(SysJob job) { job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.insertJob(job); if (rows > 0) { ScheduleUtils.createScheduleJob(scheduler, job); } return rows; } /** * 更新任務的時間表達式 * * @param job 調度信息 */ @Override public int updateJobCron(SysJob job) { int rows = jobMapper.updateJob(job); if (rows > 0) { ScheduleUtils.updateScheduleJob(scheduler, job); } return rows; } }
View Code

 

--task包框架

RyTask.java-----定時任務調度測試

package com.ruoyi.quartz.task; import org.springframework.stereotype.Component; /** * 定時任務調度測試 * * @author ruoyi */ @Component("ryTask") public class RyTask { public void ryParams(String params) { System.out.println("執行有參方法:" + params); } public void ryNoParams() { System.out.println("執行無參方法"); } }
View Code

--util包dom

ScheduleJob.java------定時任務處理
package com.ruoyi.quartz.util; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.ScheduleConstants; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.domain.SysJobLog; import com.ruoyi.quartz.service.ISysJobLogService; /** * 定時任務處理 * * @author ruoyi * */
public class ScheduleJob extends QuartzJobBean { private static final Logger log = LoggerFactory.getLogger(ScheduleJob.class); private ExecutorService service = Executors.newSingleThreadExecutor(); private final static ISysJobLogService jobLogService = (ISysJobLogService) SpringContextUtil.getBean("sysJobLogServiceImpl"); @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { SysJob job = new SysJob(); BeanUtils.copyBeanProp(job, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); SysJobLog jobLog = new SysJobLog(); jobLog.setJobName(job.getJobName()); jobLog.setJobGroup(job.getJobGroup()); jobLog.setMethodName(job.getMethodName()); jobLog.setMethodParams(job.getMethodParams()); jobLog.setCreateTime(new Date()); long startTime = System.currentTimeMillis(); try { // 執行任務
            log.info("任務開始執行 - 名稱:{} 方法:{}", job.getJobName(), job.getMethodName()); ScheduleRunnable task = new ScheduleRunnable(job.getJobName(), job.getMethodName(), job.getMethodParams()); Future<?> future = service.submit(task); future.get(); long times = System.currentTimeMillis() - startTime; // 任務狀態 0:成功 1:失敗
 jobLog.setStatus(Constants.SUCCESS); jobLog.setJobMessage(job.getJobName() + " 總共耗時:" + times + "毫秒"); log.info("任務執行結束 - 名稱:{} 耗時:{} 毫秒", job.getJobName(), times); } catch (Exception e) { log.info("任務執行失敗 - 名稱:{} 方法:{}", job.getJobName(), job.getMethodName()); log.error("任務執行異常  - :", e); long times = System.currentTimeMillis() - startTime; jobLog.setJobMessage(job.getJobName() + " 總共耗時:" + times + "毫秒"); // 任務狀態 0:成功 1:失敗
 jobLog.setStatus(Constants.FAIL); jobLog.setExceptionInfo(e.toString()); } finally { jobLogService.addJobLog(jobLog); } } }
View Code
ScheduleRunnable.java----執行定時任務
package com.ruoyi.quartz.util; import java.lang.reflect.Method; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.ReflectionUtils; import com.ruoyi.common.utils.StringUtils; /** * 執行定時任務 * * @author ruoyi * */
public class ScheduleRunnable implements Runnable { private static final Logger log = LoggerFactory.getLogger(ScheduleRunnable.class); private Object target; private Method method; private String params; public ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException { this.target = SpringContextUtil.getBean(beanName); this.params = params; if (StringUtils.isNotEmpty(params)) { this.method = target.getClass().getDeclaredMethod(methodName, String.class); } else { this.method = target.getClass().getDeclaredMethod(methodName); } } @Override public void run() { try { ReflectionUtils.makeAccessible(method); if (StringUtils.isNotEmpty(params)) { method.invoke(target, params); } else { method.invoke(target); } } catch (Exception e) { log.error("執行定時任務  - :", e); } } }
View Code
ScheduleUtils.java-----定時任務工具類
package com.ruoyi.quartz.util; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDataMap; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 { private static final Logger log = LoggerFactory.getLogger(ScheduleUtils.class); /** * 獲取觸發器key */
    public static TriggerKey getTriggerKey(Long jobId) { return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId); } /** * 獲取jobKey */
    public static JobKey getJobKey(Long jobId) { return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId); } /** * 獲取表達式觸發器 */
    public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) { try { return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId)); } catch (SchedulerException e) { log.error("getCronTrigger 異常:", e); } return null; } /** * 建立定時任務 */
    public static void createScheduleJob(Scheduler scheduler, SysJob job) { try { // 構建job信息
            JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(job.getJobId())).build(); // 表達式調度構建器
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); // 按新的cronExpression表達式構建一個新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(job.getJobId())) .withSchedule(cronScheduleBuilder).build(); // 放入參數,運行時的方法能夠獲取
 jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); scheduler.scheduleJob(jobDetail, trigger); // 暫停任務
            if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) { pauseJob(scheduler, job.getJobId()); } } catch (SchedulerException e) { log.error("createScheduleJob 異常:", e); } catch (TaskException e) { log.error("createScheduleJob 異常:", e); } } /** * 更新定時任務 */
    public static void updateScheduleJob(Scheduler scheduler, SysJob job) { try { TriggerKey triggerKey = getTriggerKey(job.getJobId()); // 表達式調度構建器
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); CronTrigger trigger = getCronTrigger(scheduler, job.getJobId()); // 按新的cronExpression表達式從新構建trigger
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); // 參數
 trigger.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); scheduler.rescheduleJob(triggerKey, trigger); // 暫停任務
            if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) { pauseJob(scheduler, job.getJobId()); } } catch (SchedulerException e) { log.error("SchedulerException 異常:", e); } catch (TaskException e) { log.error("SchedulerException 異常:", e); } } /** * 當即執行任務 */
    public static int run(Scheduler scheduler, SysJob job) { int rows = 0; try { // 參數
            JobDataMap dataMap = new JobDataMap(); dataMap.put(ScheduleConstants.TASK_PROPERTIES, job); scheduler.triggerJob(getJobKey(job.getJobId()), dataMap); rows = 1; } catch (SchedulerException e) { log.error("run 異常:", e); } return rows; } /** * 暫停任務 */
    public static void pauseJob(Scheduler scheduler, Long jobId) { try { scheduler.pauseJob(getJobKey(jobId)); } catch (SchedulerException e) { log.error("pauseJob 異常:", e); } } /** * 恢復任務 */
    public static void resumeJob(Scheduler scheduler, Long jobId) { try { scheduler.resumeJob(getJobKey(jobId)); } catch (SchedulerException e) { log.error("resumeJob 異常:", e); } } /** * 刪除定時任務 */
    public static void deleteScheduleJob(Scheduler scheduler, Long jobId) { try { scheduler.deleteJob(getJobKey(jobId)); } catch (SchedulerException e) { log.error("deleteScheduleJob 異常:", e); } } 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); } } }
View Code
SpringContextUtil.java----spring管理環境中獲取bean
package com.ruoyi.quartz.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; /** * spring管理環境中獲取bean * * @author yangzz */ @Service("springContextUtil") public class SpringContextUtil implements ApplicationContextAware { // Spring應用上下文環境
    private static ApplicationContext applicationContext; /** * 實現ApplicationContextAware接口的回調方法,設置上下文環境 * * @param applicationContext */ @Override public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */
    public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 獲取對象 * * @param name * @return Object * @throws BeansException */
    public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
View Code

 --resources包ide

-----mapper.quartz包------quartz框架的配置(.xml)工具

相關文章
相關標籤/搜索