开心一笑: 会买水果的狗狗

    关注微信公众号

    QQ群:831045818

    app下载

    当前位置:首页> java > 技术文档 > 正文
    Cron表达式提取 与计算
    发布时间:2022-06-28 13:48:50.0 浏览次数:
    package com.orientsec.test;
    
    
    import com.cronutils.descriptor.CronDescriptor;
    import com.cronutils.model.Cron;
    import com.cronutils.model.definition.CronDefinition;
    import com.cronutils.model.definition.CronDefinitionBuilder;
    import com.cronutils.model.time.ExecutionTime;
    import com.cronutils.parser.CronParser;
    import org.quartz.TriggerUtils;
    import org.quartz.impl.triggers.CronTriggerImpl;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStreamReader;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.time.Duration;
    import java.time.ZonedDateTime;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import static com.cronutils.model.CronType.*;
    
    public class CronUtil {
    
    
        public static  void  computerTime(String cronStr){
    
    
    
            String expressiion = cronStr;
            //expressiion = "46  8 * * 1-5 /usr/bin/killall -9 hostl";
            //expressiion = "0 0 0 0 5 2#1";
    
            //先提取命令中的正则表达式
            String regEx = "[//]*[a-zA-Z]+";
            Pattern pattern = Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
            // 忽略大小写的写法
            // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
            //String str = "*/2 * * * *  bin/bash /etc/titanagent/agent_update_exception.sh >> /var/log/titanagent/check.o.log 2>> /var/log/titanagent/check.e.log";
    
            System.err.println("---------------------------------------------------------");
            System.out.println(expressiion);
            Matcher matcher = pattern.matcher(expressiion);
            if(matcher.find()){
                System.out.println(matcher.group(0));
                //System.out.println(expressiion.substring(0,expressiion.indexOf(matcher.group(0))));
                expressiion = expressiion.substring(0,expressiion.indexOf(matcher.group(0))).trim();
                System.out.println(expressiion);
            }
    
            if(expressiion.trim().equals("")){
                return;
            }  
            //格式校验
            boolean b = checkValid(expressiion);
            System.out.println(b);
            CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CRON4J);
            CronParser parser = new CronParser(cronDefinition);
    
    
            ExecutionTime executionTime = ExecutionTime.forCron(parser.parse(expressiion));
    
            Optional<ZonedDateTime> zonedDateTime = executionTime.nextExecution(ZonedDateTime.now());
            System.err.println("下次执行时间: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(zonedDateTime.get().toEpochSecond()*1000L));
            Optional<ZonedDateTime> zonedDateTime1 = executionTime.lastExecution(ZonedDateTime.now());
            System.err.println("最后执行时间: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(zonedDateTime1.get().toEpochSecond()*1000L));
            ZonedDateTime timeForLast = ZonedDateTime.now();
            Optional<Duration> duration = executionTime.timeFromLastExecution(timeForLast);
            System.err.println("最后一次执行时间过去了: " + duration.get().getSeconds() + " 秒");
            Optional<Duration> duration1 = executionTime.timeToNextExecution(ZonedDateTime.now());
            System.err.println("距离下次执行时间: " + duration1.get().getSeconds()+ " 秒");
            System.err.println("---------------------------------------------------------");
    
        }
    
    
        public static void main(String[] args) throws ParseException {
            int count = 0;
            ArrayList error = new ArrayList();
            try {
    
    
                File generatefile = new File("D:\\IdeaProjects\\iauto_monitor\\src\\main\\java\\com\\orientsec\\test\\b.txt");
                InputStreamReader read = new InputStreamReader(new FileInputStream(generatefile), "utf-8");
                BufferedReader bufferedReader = new BufferedReader(read);
                String TxtBuff = new String();
                StringBuffer alltxt = new StringBuffer();
    
                while ((TxtBuff = bufferedReader.readLine()) != null) {
                    count++;
                    //alltxt.append(TxtBuff + "\n");
                    try{
                        computerTime(TxtBuff);
                    }catch (Exception e){
                        error.add(count);
                    }
    
                }
                read.close();
            }catch (Exception e){
                e.getMessage();
                e.printStackTrace();
                System.out.println("err countline = "+count);
            }
    
            System.out.println("err countline = ");
            error.stream().forEach(System.out::println);
    
            //computerTime("46  8 * * 1-5 /usr/bin/killall -9 hostl");
    
    //        if (b) {
    //            //解释cron表达式
    //            String s = describeCron(expressiion);
    //            System.out.println(s);
    //
    //            //获取下次运行时间
    //            List<Date> nextExecTime = getNextExecTime(expressiion, 5);
    //            nextExecTime.stream().forEach(d -> {
    //                System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));
    //            });
    //        }
        }
    
        /**
         * 解释cron表达式
         */
        public static String describeCron(String expressiion) {
            CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CRON4J);
            CronParser parser = new CronParser(cronDefinition);
            Cron cron = parser.parse(expressiion);
            //设置语言
            CronDescriptor descriptor = CronDescriptor.instance(Locale.CHINESE);
            return descriptor.describe(cron);
        }
    
        /**
         * 检查cron表达式的合法性
         *
         * @param cron cron exp
         * @return true if valid
         */
        public static boolean checkValid(String cron) {
            try {
                CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CRON4J);
                CronParser parser = new CronParser(cronDefinition);
                parser.parse(cron);
            } catch (IllegalArgumentException e) {
                System.out.println(String.format("cron=%s not valid", cron));
                return false;
            }
            return true;
        }
    
        /**
         * @param cronExpression cron表达式
         * @param numTimes       下一(几)次运行的时间
         * @return
         */
        public static List<Date> getNextExecTime(String cronExpression, Integer numTimes) throws ParseException {
            List<String> list = new ArrayList<>();
            CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
            cronTriggerImpl.setCronExpression(cronExpression);
            // 这个是重点,一行代码搞定
            return TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes);
        }
    
    }


    关注"都市百货" 了解南陵

    微信咨询wanglf2r(不拉群 发广告者勿加)

    0
    0
    上一篇:Java8 Stream 上一篇:2个字段内容 放到一个字段输出

    评论已有0

    提交评论

    热门评论

    南陵新闻
    公示公告
    常用查询
    风光南陵
    走出南陵
    友情链接