@Component
@Scope("singleton")
@Slf4j
public class QuartzManager implements ApplicationListener<ApplicationPreparedEvent> {
private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
private Scheduler scheduler;
@Autowired
private EquipmentPlanRepository equipmentPlanRepository;
/**
* 启动所有任务
*/
public void startAllPlan() {
try {
this.scheduler = schedulerFactory.getScheduler();
List<EquipmentPlan> equipmentPlan = equipmentPlanRepository.findByPlanningState();
equipmentPlan.forEach(this::addPlan);
} catch (SchedulerException e) {
log.error(e.getMessage(), e);
throw new RuntimeException("任务注册失败");
}
}
/**
* 添加任务
*/
public void addPlan(EquipmentPlan plan) {
if (DateTimeUtils.todayIn(plan.getStartTime(), plan.getEndTime()) && plan.getPlanningState().equals(PlanTypeOrState.START_USING.getState())) {
if (!CronExpression.isValidExpression(plan.getPollingTime())) {
log.error("时间表达式错误,请重新设置!");
return;
}
JobDetail jobDetail = JobBuilder.newJob()
.withIdentity(new JobKey(plan.getId().toString()))
.usingJobData("equipmentPlan", JSON.toJSONString(plan))
.ofType(PlanMakeTask.class)
.withDescription(plan.getPlanName())
.build();
CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule(plan.getPollingTime());
csb.withMisfireHandlingInstructionDoNothing();
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(csb)
.withIdentity(new TriggerKey(plan.getId().toString()))
.build();
//判断任务在定时器中是否已经存在,若存在将不再添加,避免重复添加任务
try {
if (!scheduler.checkExists(jobDetail.getKey())) {
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
} catch (SchedulerException se) {
log.error(se.getMessage() + ":" + plan.toString());
}
}
}
/**
* 更新任务
*
* @param jobName 任务名称
* @param cronExp 时间表达式
* @return 返回操作结果
*/
public boolean updateJob(String jobName, String cronExp) {
boolean result = false;
if (!CronExpression.isValidExpression(cronExp)) {
log.error("时间表达式错误{}", cronExp);
return result;
}
JobKey jobKey = new JobKey(jobName);
TriggerKey triggerKey = new TriggerKey(jobName);
try {
if (scheduler.checkExists(jobKey) && scheduler.checkExists(triggerKey)) {
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
Trigger newTrigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
.withIdentity(new TriggerKey(jobName))
.build();
scheduler.rescheduleJob(triggerKey, newTrigger);
result = true;
} else {
log.error("更新任务:{},任务组:{} 或者时间:{},任务组:{} 不存在",
jobKey.getName(), jobKey.getGroup(), triggerKey.getName(), triggerKey.getGroup());
}
} catch (SchedulerException e) {
log.error(e.getMessage(), e);
log.error("更新任务:{},任务组:{} 失败!", jobKey.getName(), jobKey.getGroup());
}
return result;
}
/**
* 删除任务
*
* @param jobName 任务名称
* @return 返回操作结果
*/
public boolean deleteJob(String jobName) {
boolean result = false;
JobKey jobKey = new JobKey(jobName);
try {
if (scheduler.checkExists(jobKey)) {
result = scheduler.deleteJob(jobKey);
} else {
log.error("删除 任务:{},任务组:{} 不存在.", jobKey.getName(), jobKey.getGroup());
}
} catch (SchedulerException e) {
log.error(e.getMessage(), e);
log.error("删除 任务:{},任务组:{} 失败!", jobKey.getName(), jobKey.getGroup());
}
return result;
}
/**
* 暂停指定任务
*/
public void pauseJob(String jobName) {
JobKey jobKey = new JobKey(jobName);
try {
if (scheduler.checkExists(jobKey)) {
scheduler.pauseJob(jobKey);
} else {
log.error("delete job name:{},group name:{} not exists.", jobKey.getName(), jobKey.getGroup());
}
} catch (SchedulerException e) {
log.error(e.getMessage(), e);
}
}
/**
* 重启指定的任务
*/
public void resumeJob(String jobName) {
JobKey jobKey = new JobKey(jobName);
try {
if (scheduler.checkExists(jobKey)) {
scheduler.resumeJob(jobKey);
} else {
log.error("delete job name:{},group name:{} not exists.", jobKey.getName(), jobKey.getGroup());
}
} catch (SchedulerException e) {
log.error(e.getMessage(), e);
}
}
/**
* Handle an application event.
*
* @param event the event to respond to
*/
@Override
public void onApplicationEvent(ApplicationPreparedEvent event) {
startAllPlan();
}
}