当前位置:网站首页>执行逻辑大同小异的实现类使用模板模式

执行逻辑大同小异的实现类使用模板模式

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自身的逻辑

原网站

版权声明
本文为[为爱停留]所创,转载请带上原文链接,感谢
https://blog.csdn.net/beiduofen2011/article/details/124961194