栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

接着前一篇文章:

使用枚举实现工厂模式_为爱停留的博客-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自身的逻辑

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号