package com.sandu.common.quartz.service;
|
|
import com.sandu.common.execption.BusinessException;
|
import lombok.extern.slf4j.Slf4j;
|
import org.quartz.*;
|
import org.quartz.impl.triggers.CronTriggerImpl;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.scheduling.quartz.QuartzJobBean;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
import java.util.Map;
|
|
/**
|
* @author chenjiantian
|
* @date 2021/12/15 10:39
|
* quartz job管理类
|
*/
|
@Slf4j
|
@Service
|
@ConditionalOnProperty(prefix = "sandu.quartz", name = "enable", havingValue = "true")
|
public class QuartzServiceImpl implements QuartzService {
|
|
@Resource(name = "scheduler")
|
private Scheduler scheduler;
|
|
@Override
|
public void addJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
|
try {
|
String simpleName = jobClass.getSimpleName();
|
JobDetail jobDetail = JobBuilder.newJob(jobClass)
|
.withIdentity(simpleName + jobId)
|
.build();
|
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
|
.withIdentity(simpleName + jobId)
|
.startNow()
|
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
|
.build();
|
cronTrigger.getJobDataMap().putAll(jobData);
|
((CronTriggerImpl) cronTrigger).setStartTime(new Date());
|
scheduler.scheduleJob(jobDetail, cronTrigger);
|
|
log.info("添加定时器{}", simpleName + jobId);
|
} catch (SchedulerException e) {
|
log.error("创建定时任务失败", e);
|
throw new BusinessException("创建定时任务失败");
|
}
|
}
|
|
@Override
|
public void updateJobCron(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
|
try {
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
|
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
if (trigger == null) {
|
addJob(jobClass, jobId, cron, jobData);
|
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
}
|
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
|
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
|
trigger.getJobDataMap().putAll(jobData);
|
|
scheduler.rescheduleJob(triggerKey, trigger);
|
} catch (SchedulerException e) {
|
log.error("更新定时任务失败", e);
|
throw new BusinessException("更新定时任务失败");
|
}
|
}
|
|
@Override
|
public void deleteJob(Class<? extends QuartzJobBean> jobClass, Long jobId) {
|
try {
|
JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
|
scheduler.pauseJob(jobKey);
|
scheduler.deleteJob(jobKey);
|
log.info("删除定时器{}", jobClass.getSimpleName() + jobId);
|
} catch (SchedulerException e) {
|
log.error("删除定时任务失败", e);
|
throw new BusinessException("删除定时任务失败");
|
}
|
}
|
|
@Override
|
public void pauseJob(Class<? extends QuartzJobBean> jobClass, Long jobId) {
|
try {
|
JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
|
scheduler.pauseJob(jobKey);
|
} catch (Exception e) {
|
log.error("定时任务暂停失败", e);
|
throw new BusinessException("定时任务暂停失败");
|
}
|
}
|
|
@Override
|
public void resumeJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
|
try {
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
|
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
// 如果不存在则创建一个定时任务
|
if (trigger == null) {
|
addJob(jobClass, jobId, cron, jobData);
|
}
|
JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
|
scheduler.resumeJob(jobKey);
|
} catch (Exception e) {
|
log.error("恢复定时任务失败", e);
|
throw new BusinessException("恢复定时任务失败");
|
}
|
}
|
|
@Override
|
public void runJobNow(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
|
try {
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
|
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
// 如果不存在则创建一个定时任务
|
if (trigger == null) {
|
addJob(jobClass, jobId, cron, jobData);
|
}
|
JobDataMap dataMap = new JobDataMap();
|
dataMap.putAll(jobData);
|
JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
|
scheduler.triggerJob(jobKey, dataMap);
|
} catch (Exception e) {
|
log.error("定时任务执行失败", e);
|
throw new BusinessException("定时任务执行失败");
|
}
|
}
|
}
|