2021-02-20 10:07:25 +08:00
|
|
|
|
package io.dataease.commons.utils;
|
|
|
|
|
|
2022-01-20 16:38:11 +08:00
|
|
|
|
import io.dataease.plugins.common.entity.GlobalTaskEntity;
|
|
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
2021-02-20 10:07:25 +08:00
|
|
|
|
import org.quartz.CronExpression;
|
|
|
|
|
import org.quartz.CronScheduleBuilder;
|
|
|
|
|
import org.quartz.CronTrigger;
|
|
|
|
|
import org.quartz.TriggerBuilder;
|
|
|
|
|
|
2022-01-20 16:38:11 +08:00
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.Calendar;
|
2021-02-20 10:07:25 +08:00
|
|
|
|
import java.util.Date;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author song.tianyang
|
|
|
|
|
* @Date 2020/12/17 4:06 下午
|
|
|
|
|
* @Description CRON解析类
|
|
|
|
|
*/
|
|
|
|
|
public class CronUtils {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 解析表达式,获取CronTrigger
|
|
|
|
|
* @param cron
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static CronTrigger getCronTrigger(String cron) {
|
|
|
|
|
if (!CronExpression.isValidExpression(cron)) {
|
|
|
|
|
throw new RuntimeException("cron :" + cron + "表达式解析错误");
|
|
|
|
|
}
|
|
|
|
|
return TriggerBuilder.newTrigger().withIdentity("Caclulate Date").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取以指定时间为开始时间的下一次执行时间
|
|
|
|
|
* @param cron
|
|
|
|
|
* @param start
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date getNextTriggerTime(String cron, Date start) {
|
|
|
|
|
if (start == null) {
|
|
|
|
|
return getNextTriggerTime(cron);
|
|
|
|
|
}else{
|
|
|
|
|
CronTrigger trigger = getCronTrigger(cron);
|
|
|
|
|
return trigger.getFireTimeAfter(start);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取以当前日期为准的下一次执行时间
|
|
|
|
|
* @param cron
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public static Date getNextTriggerTime(String cron) {
|
|
|
|
|
Date date = null;
|
|
|
|
|
try{
|
|
|
|
|
CronTrigger trigger = getCronTrigger(cron);
|
|
|
|
|
Date startDate = trigger.getStartTime();
|
|
|
|
|
date = trigger.getFireTimeAfter(startDate);
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return date;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-20 16:38:11 +08:00
|
|
|
|
public static String cron(GlobalTaskEntity taskEntity) {
|
|
|
|
|
if (taskEntity.getRateType() == -1) {
|
|
|
|
|
return taskEntity.getRateVal();
|
|
|
|
|
}
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
|
|
|
|
Date date = null;
|
|
|
|
|
try {
|
|
|
|
|
date = sdf.parse(taskEntity.getRateVal());
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
Calendar instance = Calendar.getInstance();
|
|
|
|
|
instance.setTime(date);
|
|
|
|
|
|
|
|
|
|
if (taskEntity.getRateType() == 0) {
|
|
|
|
|
return instance.get(Calendar.SECOND) + " " +
|
|
|
|
|
instance.get(Calendar.MINUTE) + " " +
|
|
|
|
|
instance.get(Calendar.HOUR_OF_DAY) + " * * ?";
|
|
|
|
|
}
|
|
|
|
|
if (taskEntity.getRateType() == 1) {
|
|
|
|
|
return instance.get(Calendar.SECOND) + " " +
|
|
|
|
|
instance.get(Calendar.MINUTE) + " " +
|
|
|
|
|
instance.get(Calendar.HOUR_OF_DAY) + " ? * " +
|
|
|
|
|
getDayOfWeek(instance);
|
|
|
|
|
}
|
|
|
|
|
if (taskEntity.getRateType() == 2) {
|
|
|
|
|
return instance.get(Calendar.SECOND) + " " +
|
|
|
|
|
instance.get(Calendar.MINUTE) + " " +
|
|
|
|
|
instance.get(Calendar.HOUR_OF_DAY) + " " +
|
|
|
|
|
instance.get(Calendar.DATE) + " * ?";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
private static String getDayOfWeek(Calendar instance) {
|
|
|
|
|
int index = instance.get(Calendar.DAY_OF_WEEK);
|
|
|
|
|
index = (index + 1) % 7;
|
|
|
|
|
return String.valueOf(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 判断任务是否过期
|
|
|
|
|
public static Boolean taskExpire(Long endTime) {
|
|
|
|
|
if (ObjectUtils.isEmpty(endTime))
|
|
|
|
|
return false;
|
|
|
|
|
Long now = System.currentTimeMillis();
|
|
|
|
|
return now > endTime;
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-20 10:07:25 +08:00
|
|
|
|
|
|
|
|
|
}
|