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
2021年南陵计划生育补贴
南陵2021年度独生子女保健费名单
南陵2021年四员扶贫公益性岗位补
南陵2020年度农机购置补贴名单
南陵2021年农业补贴名单
南陵县2021年扶贫小额信贷
南陵2021年城乡居保财政代缴和另
2020年南陵创业担保贷款名单
热门评论