package com.billion.quartz.service.impl; import java.util.List; import javax.annotation.PostConstruct; import org.quartz.JobDataMap; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.billion.common.constant.ScheduleConstants; import com.billion.common.exception.job.TaskException; import com.billion.quartz.domain.SysJob; import com.billion.quartz.mapper.SysJobMapper; import com.billion.quartz.service.ISysJobService; import com.billion.quartz.util.CronUtils; import com.billion.quartz.util.ScheduleUtils; /** * å®šæ—¶ä»»åŠ¡è°ƒåº¦ä¿¡æ¯ æœåŠ¡å±‚ * * @author ruoyi */ @Service public class SysJobServiceImpl implements ISysJobService { @Autowired private Scheduler scheduler; @Autowired private SysJobMapper jobMapper; /** * 项目å¯åŠ¨æ—¶ï¼Œåˆå§‹åŒ–定时器 主è¦æ˜¯é˜²æ¢æ‰‹åŠ¨ä¿®æ”¹æ•°æ®åº“导致未åŒæ¥åˆ°å®šæ—¶ä»»åŠ¡å¤„ç†ï¼ˆæ³¨ï¼šä¸èƒ½æ‰‹åŠ¨ä¿®æ”¹æ•°æ®åº“ID和任务组å,å¦åˆ™ä¼šå¯¼è‡´è„æ•°æ®ï¼‰ */ @PostConstruct public void init() throws SchedulerException, TaskException { scheduler.clear(); List<SysJob> jobList = jobMapper.selectJobAll(); for (SysJob job : jobList) { ScheduleUtils.createScheduleJob(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 @Transactional(rollbackFor = Exception.class) public int pauseJob(SysJob job) throws SchedulerException { Long jobId = job.getJobId(); String jobGroup = job.getJobGroup(); job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.updateJob(job); if (rows > 0) { scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } return rows; } /** * æ¢å¤ä»»åŠ¡ * * @param job è°ƒåº¦ä¿¡æ¯ */ @Override @Transactional(rollbackFor = Exception.class) public int resumeJob(SysJob job) throws SchedulerException { Long jobId = job.getJobId(); String jobGroup = job.getJobGroup(); job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); int rows = jobMapper.updateJob(job); if (rows > 0) { scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } return rows; } /** * åˆ é™¤ä»»åŠ¡åŽï¼Œæ‰€å¯¹åº”çš„triggerä¹Ÿå°†è¢«åˆ é™¤ * * @param job è°ƒåº¦ä¿¡æ¯ */ @Override @Transactional(rollbackFor = Exception.class) public int deleteJob(SysJob job) throws SchedulerException { Long jobId = job.getJobId(); String jobGroup = job.getJobGroup(); int rows = jobMapper.deleteJobById(jobId); if (rows > 0) { scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } return rows; } /** * 批é‡åˆ é™¤è°ƒåº¦ä¿¡æ¯ * * @param jobIds 需è¦åˆ 除的任务ID * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) public void deleteJobByIds(Long[] jobIds) throws SchedulerException { for (Long jobId : jobIds) { SysJob job = jobMapper.selectJobById(jobId); deleteJob(job); } } /** * 任务调度状æ€ä¿®æ”¹ * * @param job è°ƒåº¦ä¿¡æ¯ */ @Override @Transactional(rollbackFor = Exception.class) public int changeStatus(SysJob job) throws SchedulerException { 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 @Transactional(rollbackFor = Exception.class) public boolean run(SysJob job) throws SchedulerException { boolean result = false; Long jobId = job.getJobId(); String jobGroup = job.getJobGroup(); SysJob properties = selectJobById(job.getJobId()); // å‚æ•° JobDataMap dataMap = new JobDataMap(); dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); if (scheduler.checkExists(jobKey)) { result = true; scheduler.triggerJob(jobKey, dataMap); } return result; } /** * 新增任务 * * @param job è°ƒåº¦ä¿¡æ¯ è°ƒåº¦ä¿¡æ¯ */ @Override @Transactional(rollbackFor = Exception.class) public int insertJob(SysJob job) throws SchedulerException, TaskException { job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.insertJob(job); if (rows > 0) { ScheduleUtils.createScheduleJob(scheduler, job); } return rows; } /** * æ›´æ–°ä»»åŠ¡çš„æ—¶é—´è¡¨è¾¾å¼ * * @param job è°ƒåº¦ä¿¡æ¯ */ @Override @Transactional(rollbackFor = Exception.class) public int updateJob(SysJob job) throws SchedulerException, TaskException { SysJob properties = selectJobById(job.getJobId()); int rows = jobMapper.updateJob(job); if (rows > 0) { updateSchedulerJob(job, properties.getJobGroup()); } return rows; } /** * 更新任务 * * @param job 任务对象 * @param jobGroup 任务组å */ public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException { Long jobId = job.getJobId(); // 判æ–是å¦å˜åœ¨ JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); if (scheduler.checkExists(jobKey)) { // 防æ¢åˆ›å»ºæ—¶å˜åœ¨æ•°æ®é—®é¢˜ 先移除,然åŽåœ¨æ‰§è¡Œåˆ›å»ºæ“作 scheduler.deleteJob(jobKey); } ScheduleUtils.createScheduleJob(scheduler, job); } /** * æ ¡éªŒcron表达å¼æ˜¯å¦æœ‰æ•ˆ * * @param cronExpression è¡¨è¾¾å¼ * @return 结果 */ @Override public boolean checkCronExpressionIsValid(String cronExpression) { return CronUtils.isValid(cronExpression); } }