当前位置:网站首页>执行逻辑大同小异的实现类使用模板模式
执行逻辑大同小异的实现类使用模板模式
2022-06-22 15:10:00 【为爱停留】
接着前一篇文章:
使用枚举实现工厂模式_为爱停留的博客-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<Trigger> 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;
}
/**
* 更新job信息
*/
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<Trigger> 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;
}
/**
* 删除定时任务
* @return
*/
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<Trigger> 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<Trigger> 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<HolidayPO> 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<HolidayPO> 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<HolidayPO> 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<Trigger> 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<Trigger> 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<Trigger> 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自身的逻辑
边栏推荐
猜你喜欢
随机推荐
SAP ABAP 对话框编程教程:中的模块池-09
Applet development - Custom expiration cache
String的模拟实现
【山大会议】应用设置模块
浙江创投圈的“半壁江山”,还得是国资
数睿数据受邀参与南通企业数字化转型研讨会
SAP web service 无法使用 SOAMANAGER 登陆到SOA管理页面
ArcGIS JS之 4.23之IIS本地部署与问题解决
【山大会议】注册页的编写
What is the relationship between CSC securities and qiniu school? Is it safe to open a securities account
SAP ABAP 中 OpenSQL和Native SQL-05 本教程的目的不是教您 SQL 或数据库概念
Simulation of vector
Swift -- save print log to sandbox
ORB_ VI ideological framework
中信建投证券是跟启牛学堂存在什么关系?开证券账户安全吗
SAP ABAP BAPI-016
数睿数据深度 | 关于软件自主可控,源代码向左,无代码向右
5.文件的读写(学生类)
wallys/WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz
LeetCode_回溯_动态规划_中等_131.分割回文串









![[译文] 弥合开源数据库和数据库业务之间的鸿沟](/img/e5/f89a8f3e2e9034f557ea3e76f37f81.jpg)