接着前一篇文章:
使用枚举实现工厂模式_为爱停留的博客-CSDN博客如现在有从四个维度日度/周度/自定义,实现定时调度,现在每个维度有一个实现类,当创建不同维度的定时器的时候,就会触发实现类去执行枚举类:package com.htf.damp.custom_enum;import com.htf.damp.quartz.QuartzCustomManager;import com.htf.damp.quartz.QuartzDayManager;import com.htf.damp.quartz.QuartzMonthManager;import chttps://blog.csdn.net/beiduofen2011/article/details/124960472有四个实现类QuartzCustomManager 日度,QuartzDayManager 周度,QuartzMonthManager月度QuartzWeekManager自定义,都继承了CreateTaskQuartzManager类
模板模式的定义是一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式
在CreateTaskQuartzManager中定义方法执行的模板
package com.htf.damp.quartz;
import com.htf.damp.model.CreateTaskModel;
import com.htf.damp.quartz.job.CreateTaskJob;
import com.htf.util.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public abstract class CreateTaskQuartzManager {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
public Trigger addJob(CreateTaskModel createTaskModel){
// 创建Trigger对象
Trigger trigger = null;
try {
StdScheduler scheduler = (StdScheduler) schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(createTaskModel.getExecutorId()+"_"+ createTaskModel.getScheduleId(), createTaskModel.getRuleId());
if(scheduler.checkExists(triggerKey)){
trigger = modifyJob(createTaskModel);
} else {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("createTaskModel", JsonUtils.toString(createTaskModel));
// 任务名,任务组,任务执行类
JobDetail jobDetail = JobBuilder.newJob(CreateTaskJob.class).setJobData(jobDataMap).build();
// 触发器
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(createTaskModel.getExecutorId()+"_"+ createTaskModel.getScheduleId(), createTaskModel.getRuleId());
// 触发器时间设定
configTriggerSchedule(triggerBuilder,scheduler, createTaskModel);
trigger = triggerBuilder.build();
// 调度容器设置JobDetail和Trigger
scheduler.scheduleJob(jobDetail, trigger);
}
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return trigger;
}
public Trigger modifyJob(CreateTaskModel createTaskModel){
// 创建Trigger对象
Trigger trigger = null;
try {
StdScheduler scheduler = (StdScheduler) schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(createTaskModel.getExecutorId()+"_"+ createTaskModel.getScheduleId(), createTaskModel.getRuleId());
if(scheduler.checkExists(triggerKey)){
// 触发器
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(createTaskModel.getExecutorId()+"_"+ createTaskModel.getScheduleId(), createTaskModel.getRuleId());
// 触发器时间设定
configTriggerSchedule(triggerBuilder,scheduler, createTaskModel);
trigger = triggerBuilder.build();
scheduler.rescheduleJob(triggerKey, trigger);
} else {
addJob(createTaskModel);
}
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return trigger;
}
public boolean deleteJob(CreateTaskModel createTaskModel){
boolean result = false;
try {
StdScheduler scheduler = (StdScheduler) schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(createTaskModel.getExecutorId()+"_"+ createTaskModel.getScheduleId(), createTaskModel.getRuleId());
if(scheduler.checkExists(triggerKey)){
// 获取trigger
Trigger trigger = scheduler.getTrigger(triggerKey);
// 停止触发器
scheduler.pauseTrigger(triggerKey);
// 删除任务
if(trigger != null){
result = scheduler.deleteJob(trigger.getJobKey());
}else{
// 移除触发器
scheduler.unscheduleJob(triggerKey);
}
}
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return result;
}
abstract void configTriggerSchedule(TriggerBuilder triggerBuilder, StdScheduler scheduler, CreateTaskModel createTaskModel) throws SchedulerException;
}
其固定addJob方法执行逻辑,只是部分逻辑通过抽象方法让子类去实现
日度逻辑package com.htf.damp.quartz;
import com.htf.damp.custom_enum.DateTypeEnum;
import com.htf.damp.custom_enum.SkipWeekendEnum;
import com.htf.damp.custom_enum.TimeGenModeEnum;
import com.htf.damp.mapper.HolidayMapper;
import com.htf.damp.model.CreateTaskModel;
import com.htf.damp.model.po.HolidayPO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.quartz.impl.calendar.AnnualCalendar;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.List;
@Slf4j
@Component
public class QuartzDayManager extends CreateTaskQuartzManager {
@Autowired
private HolidayMapper holidayMapper;
@Override
void configTriggerSchedule(TriggerBuilder triggerBuilder , StdScheduler scheduler, CreateTaskModel createTaskModel) throws SchedulerException {
String genCode = createTaskModel.getGenCode();
StringBuilder calendayName = new StringBuilder();
String cron = "0 %d %d * * ? *";
String scheduleTime = createTaskModel.getScheduleTime();
String[] scheduleTimeArray = scheduleTime.split(":");
int hour = Integer.parseInt(scheduleTimeArray[0]);
int minute = Integer.parseInt(scheduleTimeArray[1]);
cron = String.format(cron, minute,hour);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
if(TimeGenModeEnum.LEGAL_WORKING_DAY.getCode() == Integer.parseInt(genCode)){
List holidayPOS = holidayMapper.selectByDateType(DateTypeEnum.HOLIDAY.getCode());
AnnualCalendar holidays = new AnnualCalendar();
holidayPOS.forEach(x->{
String theDay = x.getTheDate();
String[] array = theDay.split("-");
int year = Integer.parseInt(array[0]);
int month = Integer.parseInt(array[1]);
int day = Integer.parseInt(array[2]);
Calendar gupaoDay = new GregorianCalendar(year, month-1, day);
holidays.setDayExcluded(gupaoDay, true);
});
calendayName.append("holidays_");
if(createTaskModel.getIsSkipWeekend() == SkipWeekendEnum.IS_SKIP.getCode()){
List weekends = holidayMapper.selectByDateType(DateTypeEnum.WEEKEED.getCode());
weekends.forEach(x-> {
String theDay = x.getTheDate();
String[] array = theDay.split("-");
int year = Integer.parseInt(array[0]);
int month = Integer.parseInt(array[1]);
int day = Integer.parseInt(array[2]);
Calendar gupaoDay = new GregorianCalendar(year, month - 1, day);
holidays.setDayExcluded(gupaoDay, true);
});
calendayName.append("week_");
}
String calName = calendayName.substring(0,calendayName.length()-1);
// 调度器添加日
scheduler.addCalendar(calName, holidays, true, false);
triggerBuilder.withSchedule(cronScheduleBuilder).modifiedByCalendar(calName);
}else if(TimeGenModeEnum.EVERY_DAY.getCode() == Integer.parseInt(genCode)){
if(createTaskModel.getIsSkipWeekend() == SkipWeekendEnum.IS_SKIP.getCode()){
AnnualCalendar holidays = new AnnualCalendar();
List weekends = holidayMapper.selectByDateType(DateTypeEnum.WEEKEED.getCode());
weekends.forEach(x-> {
String theDay = x.getTheDate();
String[] array = theDay.split("-");
int year = Integer.parseInt(array[0]);
int month = Integer.parseInt(array[1]);
int day = Integer.parseInt(array[2]);
Calendar gupaoDay = new GregorianCalendar(year, month - 1, day);
holidays.setDayExcluded(gupaoDay, true);
});
scheduler.addCalendar("week", holidays, true, false);
triggerBuilder.withSchedule(cronScheduleBuilder).modifiedByCalendar("week");
}else{
triggerBuilder.withSchedule(cronScheduleBuilder);
}
}
}
}
周度逻辑:
package com.htf.damp.quartz;
import com.htf.damp.model.CreateTaskModel;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class QuartzWeekManager extends CreateTaskQuartzManager {
@Override
void configTriggerSchedule(TriggerBuilder triggerBuilder, StdScheduler scheduler, CreateTaskModel createTaskModel) throws SchedulerException {
String week = createTaskModel.getGenCode();
String cron = "0 %d %d ? * %d *";
String scheduleTime = createTaskModel.getScheduleTime();
String[] scheduleTimeArray = scheduleTime.split(":");
int hour = Integer.parseInt(scheduleTimeArray[0]);
int minute = Integer.parseInt(scheduleTimeArray[1]);
cron = String.format(cron, minute,hour,Integer.parseInt(week));
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
triggerBuilder.withSchedule(cronScheduleBuilder);
}
}
月度逻辑:
package com.htf.damp.quartz;
import com.htf.damp.custom_enum.TimeGenModeEnum;
import com.htf.damp.model.CreateTaskModel;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class QuartzMonthManager extends CreateTaskQuartzManager {
@Override
void configTriggerSchedule(TriggerBuilder triggerBuilder, StdScheduler scheduler, CreateTaskModel createTaskModel) throws SchedulerException {
String scheduleTime = createTaskModel.getScheduleTime();
String[] scheduleTimeArray = scheduleTime.split(":");
int hour = Integer.parseInt(scheduleTimeArray[0]);
int minute = Integer.parseInt(scheduleTimeArray[1]);
String dayStr = createTaskModel.getGenCode();
int day = Integer.parseInt(dayStr);
String cron ;
if(TimeGenModeEnum.LAST_DAY.getCode().equals(dayStr) || day > 28){
cron = "0 %d %d 28-31 * ? *";
cron = String.format(cron, minute,hour);
}else {
cron = "0 %d %d %d * ? ";
cron = String.format(cron, minute,hour,day);
}
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
triggerBuilder.withSchedule(cronScheduleBuilder);
}
}
自定义逻辑:
package com.htf.damp.quartz;
import com.htf.damp.model.CreateTaskModel;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Slf4j
@Component
public class QuartzCustomManager extends CreateTaskQuartzManager {
@Override
void configTriggerSchedule(TriggerBuilder triggerBuilder, StdScheduler scheduler, CreateTaskModel createTaskModel) throws SchedulerException {
String[] strings = createTaskModel.getGenCode().split("-");
String day = strings[0];
String hour = strings[1];
String minute = strings[2];
Integer minuteInterval = 0;
if(!StringUtils.isEmpty(day)){
minuteInterval += Integer.parseInt(day)*24*60;
}
if(!StringUtils.isEmpty(hour)){
minuteInterval += Integer.parseInt(hour)*60;
}
if(!StringUtils.isEmpty(minute)){
minuteInterval += Integer.parseInt(minute);
}
// 设置优先级
triggerBuilder.startAt(createTaskModel.getStartTime());
// 触发器时间设定
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(minuteInterval).repeatForever());
}
}
当我们 声明CreateTaskQuartzManager createTaskQuartzManager = new QuartzDayManager(),其就能按照CreateTaskQuartzManager中addJob规定的执行流程,去执行QuartzDayManager自身的逻辑



