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(不拉群 发广告者勿加)
热门评论