package com.sandu.common.quartz.service;
|
|
import com.sandu.common.execption.BusinessException;
|
import com.sandu.common.quartz.ExecutionJob;
|
import com.sandu.common.quartz.dto.QuartzJobDto;
|
import lombok.extern.slf4j.Slf4j;
|
import org.quartz.*;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.scheduling.quartz.QuartzJobBean;
|
import org.springframework.stereotype.Service;
|
import javax.annotation.Resource;
|
|
/**
|
* @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, QuartzJobDto quartzJobDto) {
|
try {
|
String simpleName = jobClass.getSimpleName();
|
JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class)
|
.withIdentity(simpleName + quartzJobDto.getId())
|
.build();
|
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
|
.withIdentity(simpleName + quartzJobDto.getId())
|
.withSchedule(CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression()))
|
.build();
|
cronTrigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto);
|
|
scheduler.scheduleJob(jobDetail, cronTrigger);
|
|
} catch (SchedulerException e) {
|
log.error("创建定时任务失败", e);
|
throw new BusinessException("创建定时任务失败");
|
}
|
}
|
|
@Override
|
public void updateJobCron(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
|
try {
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
|
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
if (trigger == null) {
|
addJob(jobClass, quartzJobDto);
|
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
}
|
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression());
|
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
|
trigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto);
|
|
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);
|
} 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, QuartzJobDto quartzJobDto) {
|
try {
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
|
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
// 如果不存在则创建一个定时任务
|
if (trigger == null) {
|
addJob(jobClass, quartzJobDto);
|
}
|
JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId());
|
scheduler.resumeJob(jobKey);
|
} catch (Exception e) {
|
log.error("恢复定时任务失败", e);
|
throw new BusinessException("恢复定时任务失败");
|
}
|
}
|
|
@Override
|
public void runJobNow(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
|
try {
|
TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
|
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
// 如果不存在则创建一个定时任务
|
if (trigger == null) {
|
addJob(jobClass, quartzJobDto);
|
}
|
JobDataMap dataMap = new JobDataMap();
|
dataMap.put(QuartzJobDto.JOB_KEY, quartzJobDto);
|
JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId());
|
scheduler.triggerJob(jobKey, dataMap);
|
} catch (Exception e) {
|
log.error("定时任务执行失败", e);
|
throw new BusinessException("定时任务执行失败");
|
}
|
}
|
}
|