diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/strategy/WaitStrategies.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/strategy/WaitStrategies.java index 324f778e1..d30ff522a 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/strategy/WaitStrategies.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/strategy/WaitStrategies.java @@ -1,5 +1,6 @@ package com.aizuda.snailjob.server.common.strategy; +import cn.hutool.core.lang.Assert; import com.aizuda.snailjob.common.core.exception.SnailJobCommonException; import com.aizuda.snailjob.common.core.util.CronExpression; import com.aizuda.snailjob.server.common.WaitStrategy; @@ -179,6 +180,7 @@ public class WaitStrategies { try { Date nextValidTime = new CronExpression(context.getTriggerInterval()).getNextValidTimeAfter(new Date(context.getNextTriggerAt())); + Assert.notNull(nextValidTime, () -> new SnailJobServerException("表达式错误:{}", context.getTriggerInterval())); return DateUtils.toEpochMilli(nextValidTime); } catch (ParseException e) { throw new SnailJobServerException("解析CRON表达式异常 [{}]", context.getTriggerInterval(), e); diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/util/CronUtils.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/util/CronUtils.java index 75aa0fc02..77ba6b039 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/util/CronUtils.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/util/CronUtils.java @@ -12,6 +12,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Objects; /** * @author opensnail @@ -29,6 +30,9 @@ public class CronUtils { try { ZonedDateTime zdt = now.atZone(ZoneOffset.ofHours(8)); nextValidTime = new CronExpression(cron).getNextValidTimeAfter(Date.from(zdt.toInstant())); + if (Objects.isNull(nextValidTime)) { + continue; + } now = LocalDateTime.ofEpochSecond(nextValidTime.getTime() / 1000, 0, ZoneOffset.ofHours(8)); list.add(DateUtils.format(now, DateUtils.NORM_DATETIME_PATTERN)); } catch (ParseException ignored) { @@ -40,7 +44,8 @@ public class CronUtils { public static long getExecuteInterval(String cron) { List executeTimeByCron = getExecuteTimeByCron(cron, 2); - Assert.isTrue(!executeTimeByCron.isEmpty(), () -> new SnailJobServerException("[{}]表达式解析有误", cron)); + Assert.isTrue(!executeTimeByCron.isEmpty(), () -> new SnailJobServerException("表达式解析有误.[{}]", cron)); + Assert.isTrue(executeTimeByCron.size() == 2, () -> new SnailJobServerException("表达式必须支持多次执行.[{}]", cron)); LocalDateTime first = LocalDateTime.parse(executeTimeByCron.get(0), DateUtils.NORM_DATETIME_PATTERN); LocalDateTime second = LocalDateTime.parse(executeTimeByCron.get(1), DateUtils.NORM_DATETIME_PATTERN); Duration duration = Duration.between(first, second);