mysql boot cron 实现动态加载

实现思路:
一、前端传入时间字段 和 定时任务类型字段 生成 cron表达式存进数据库
二、boot 加载数据库配置 执行定时任务

代码:
一、
数据库新增 cron表 字段如下
在这里插入图片描述
生成cron表达式

import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

/**
 * @Date: 2021/3/11 9:36
 */
@Component //测试时调用声名
public class CronUtils {

    //"ss mm HH dd MM ? yyyy"   每年的指定日执行
    private static final SimpleDateFormat sdf0 = new SimpleDateFormat("ss mm HH dd MM ?");
    //每月的指定日执行
    private static final SimpleDateFormat sdf1 = new SimpleDateFormat("ss mm HH dd * ?");
    //每日的指定时间执行
    private static final SimpleDateFormat sdf2 = new SimpleDateFormat("ss mm HH * * ?");
    //每小时执行
    private static final SimpleDateFormat sdf3 = new SimpleDateFormat("ss mm * * * ?");
    //每分钟执行
    private static final SimpleDateFormat sdf4 = new SimpleDateFormat("ss * * * * ?");
    //每秒
    private static final SimpleDateFormat sdf5 = new SimpleDateFormat("0/ss * * * * ?");

    /***
     * convert Date to cron, eg "0 07 10 15 1 ?"
     * @param date  : 时间点
     * @return type=0 年  1 月  2日  3小时  4分钟  5秒
     */
    public static String getCron(Date date,int type) {
        String formatTimeStr = null;
        if (Objects.nonNull(date)) {
            switch (type){
                case 0:
                    formatTimeStr = sdf0.format(date);
                    break;
                case 1:
                    formatTimeStr = sdf1.format(date);
                    break;
                case 2:
                    formatTimeStr = sdf2.format(date);
                    break;
                case 3:
                    formatTimeStr = sdf3.format(date);
                    break;
                case 4:
                    formatTimeStr = sdf4.format(date);
                    break;
                case 5:
                    formatTimeStr = sdf5.format(date);
                    break;
                default :
                    formatTimeStr=null;
                    break;
            }
        }
        return formatTimeStr;
    }

    public static void main(String[] args) throws Exception{
        String time = "2021-03-11 09:40:05";
        Date date = DateUtil.getDataByString(time);
        System.err.println(getCron(date,0));
        System.err.println(getCron(date,1));
        System.err.println(getCron(date,2));
        System.err.println(getCron(date,3));
        System.err.println(getCron(date,4));
        System.err.println(getCron(date,5));
    }

二、
新建 CompleteScheduleConfig 配置类

import chunxiao.zcy.mapper.CronMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import java.time.LocalDateTime;

/**
 * @Date: 2021/3/11 9:11
 */
@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {

    @Autowired
    private CronMapper cronMapper; //mapper接口

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                //1.自己的业务(Runnable)
                () -> System.out.println("定时任务: " + LocalDateTime.now().toLocalTime()),
                //2.设置执行周期(Trigger)
                triggerContext -> {
                    //2.1 从数据库获取执行周期
                    String cron = cronMapper.getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
                        System.out.println("数据格式不正确");
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }
}

测试方法调用

 	@Test
    public void cuowuBid(){
        try {
        	String time = "2021-03-11 09:44:00";
            Date date = DateUtil.getDataByString(time);
            
            Cron cron = new Cron();
            cron.setCron(CronUtils.getCron(date,4));
            cron.setId(1);
            cronMapper.updateByPrimaryKeySelective(cron);
            
            System.err.println("成功");
        }catch (Exception e){
            System.err.println(e);
        }
    }

结果
在这里插入图片描述
觉得好用点个赞,写的不好请指出,共同进步谢谢

再补充个方法,先感谢方法的来源者 ******
新建实体类TaskScheduleModel

import lombok.Data;

/**
 * @Date: 2021/3/11 15:19
 */
@Data
public class TaskScheduleModel {

    /**
     * 所选作业类型:
     * 1  -> 每天
     * 2  -> 每月
     * 3  -> 每周
     * 4  ->间隔(每隔2个小时,每隔30分钟)
     */
    Integer jobType;

    /**一周的哪几天*/
    Integer[] dayOfWeeks;

    /**一个月的哪几天*/
    Integer[] dayOfMonths;

    /**秒  */
    Integer second;

    /**分  */
    Integer minute;

    /**时  */
    Integer hour;

    public TaskScheduleModel() {
    }

    public TaskScheduleModel(Integer jobType, Integer[] dayOfWeeks, Integer[] dayOfMonths, Integer second, Integer minute, Integer hour) {
        this.jobType = jobType;
        this.dayOfWeeks = dayOfWeeks;
        this.dayOfMonths = dayOfMonths;
        this.second = second;
        this.minute = minute;
        this.hour = hour;
    }

工具类 方法

/**
     *
     *方法摘要:构建Cron表达式
     *@param  taskScheduleModel
     *@return String
     */
    public static String createCronExpression(TaskScheduleModel taskScheduleModel){
        StringBuffer cronExp = new StringBuffer("");

        if(null == taskScheduleModel.getJobType()) {
            System.out.println("执行周期未配置" );//执行周期未配置
        }

        if (null != taskScheduleModel.getSecond()
                && null != taskScheduleModel.getMinute()
                && null != taskScheduleModel.getHour()) {
            //秒
            cronExp.append(taskScheduleModel.getSecond()).append(" ");
            //分
            cronExp.append(taskScheduleModel.getMinute()).append(" ");
            //小时
            cronExp.append(taskScheduleModel.getHour()).append(" ");

            //每天
            if(taskScheduleModel.getJobType().intValue() == 1){
                cronExp.append("* ");//日
                cronExp.append("* ");//月
                cronExp.append("?");//周
            }

            //按每周
            else if(taskScheduleModel.getJobType().intValue() == 3){
                //一个月中第几天
                cronExp.append("? ");
                //月份
                cronExp.append("* ");
                //周
                Integer[] weeks = taskScheduleModel.getDayOfWeeks();
                for(int i = 0; i < weeks.length; i++){
                    if(i == 0){
                        cronExp.append(weeks[i]);
                    } else{
                        cronExp.append(",").append(weeks[i]);
                    }
                }

            }

            //按每月
            else if(taskScheduleModel.getJobType().intValue() == 2){
                //一个月中的哪几天
                Integer[] days = taskScheduleModel.getDayOfMonths();
                for(int i = 0; i < days.length; i++){
                    if(i == 0){
                        cronExp.append(days[i]);
                    } else{
                        cronExp.append(",").append(days[i]);
                    }
                }
                //月份
                cronExp.append(" * ");
                //周
                cronExp.append("?");
            }
        }
        else {
            System.out.println("时或分或秒参数未配置" );//时或分或秒参数未配置
        }
        return cronExp.toString();
    }

    /**
     *
     *方法摘要:生成计划的详细描述
     *@param  taskScheduleModel
     *@return String
     */
    public static String createDescription(TaskScheduleModel taskScheduleModel){
        StringBuffer description = new StringBuffer("");
        //计划执行开始时间
//      Date startTime = taskScheduleModel.getScheduleStartTime();

        if (null != taskScheduleModel.getSecond()
                && null != taskScheduleModel.getMinute()
                && null != taskScheduleModel.getHour()) {
            //按每天
            if(taskScheduleModel.getJobType().intValue() == 1){
                description.append("每天");
                description.append(taskScheduleModel.getHour()).append("时");
                description.append(taskScheduleModel.getMinute()).append("分");
                description.append(taskScheduleModel.getSecond()).append("秒");
                description.append("执行");
            }

            //按每周
            else if(taskScheduleModel.getJobType().intValue() == 3){
                if(taskScheduleModel.getDayOfWeeks() != null && taskScheduleModel.getDayOfWeeks().length > 0) {
                    String days = "";
                    for(int i : taskScheduleModel.getDayOfWeeks()) {
                        days += "周" + i;
                    }
                    description.append("每周的").append(days).append(" ");
                }
                if (null != taskScheduleModel.getSecond()
                        && null != taskScheduleModel.getMinute()
                        && null != taskScheduleModel.getHour()) {
                    description.append(",");
                    description.append(taskScheduleModel.getHour()).append("时");
                    description.append(taskScheduleModel.getMinute()).append("分");
                    description.append(taskScheduleModel.getSecond()).append("秒");
                }
                description.append("执行");
            }

            //按每月
            else if(taskScheduleModel.getJobType().intValue() == 2){
                //选择月份
                if(taskScheduleModel.getDayOfMonths() != null && taskScheduleModel.getDayOfMonths().length > 0) {
                    String days = "";
                    for(int i : taskScheduleModel.getDayOfMonths()) {
                        days += i + "号";
                    }
                    description.append("每月的").append(days).append(" ");
                }
                description.append(taskScheduleModel.getHour()).append("时");
                description.append(taskScheduleModel.getMinute()).append("分");
                description.append(taskScheduleModel.getSecond()).append("秒");
                description.append("执行");
            }
        }
        return description.toString();
    }

main方法测试:

 public static void main(String[] args) throws Exception{
//        String time = "2021-03-11 09:40:05";
//        Date date = DateUtil.getDataByString(time);
//        System.err.println(getCron(date,0));
//        System.err.println(getCron(date,1));
//        System.err.println(getCron(date,2));
//        System.err.println(getCron(date,3));
//        System.err.println(getCron(date,4));
//        System.err.println(getCron(date,5));

        //执行时间:每天的12时12分12秒 start
        TaskScheduleModel taskScheduleModel = new TaskScheduleModel();
        taskScheduleModel.setJobType(1);//按每天
        Integer hour = 12; //时
        Integer minute = 12; //分
        Integer second = 12; //秒
        taskScheduleModel.setHour(hour);
        taskScheduleModel.setMinute(minute);
        taskScheduleModel.setSecond(second);
        String cropExp = createCronExpression(taskScheduleModel);
        System.out.println(cropExp + ":" + createDescription(taskScheduleModel));
        //执行时间:每天的12时12分12秒 end

        taskScheduleModel.setJobType(3);//每周的哪几天执行
        Integer[] dayOfWeeks = new Integer[3];
        dayOfWeeks[0] = 1;
        dayOfWeeks[1] = 2;
        dayOfWeeks[2] = 3;
        taskScheduleModel.setDayOfWeeks(dayOfWeeks);
        cropExp = createCronExpression(taskScheduleModel);
        System.out.println(cropExp + ":" + createDescription(taskScheduleModel));

        taskScheduleModel.setJobType(2);//每月的哪几天执行
        Integer[] dayOfMonths = new Integer[3];
        dayOfMonths[0] = 1;
        dayOfMonths[1] = 21;
        dayOfMonths[2] = 13;
        taskScheduleModel.setDayOfMonths(dayOfMonths);
        cropExp = createCronExpression(taskScheduleModel);
        System.out.println(cropExp + ":" + createDescription(taskScheduleModel));

    }

结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小可乐-我一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值