This is an automated email from the ASF dual-hosted git repository.
caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 61637cc0a3 [Bug] [Cron] Parse corn expression error (#13841)
61637cc0a3 is described below
commit 61637cc0a377007e093a9c0f92eb5956bff6ecad
Author: 旺阳 <[email protected]>
AuthorDate: Sun Apr 9 12:50:42 2023 +0800
[Bug] [Cron] Parse corn expression error (#13841)
* fix-cron
* update catch exception
---
.../service/impl/ProcessDefinitionServiceImpl.java | 3 ++-
.../api/service/impl/SchedulerServiceImpl.java | 7 +++----
.../api/service/SchedulerServiceTest.java | 8 ++++++++
.../dolphinscheduler/service/cron/CronUtils.java | 20 +++++++++++++++++++-
.../dolphinscheduler/service/cron/CronUtilsTest.java | 6 ++++++
5 files changed, 38 insertions(+), 6 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index fde462e9e9..4e7e750ba0 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -122,6 +122,7 @@ import
org.apache.dolphinscheduler.plugin.task.api.enums.TaskTimeoutStrategy;
import org.apache.dolphinscheduler.plugin.task.api.model.Property;
import org.apache.dolphinscheduler.plugin.task.api.parameters.ParametersNode;
import org.apache.dolphinscheduler.plugin.task.api.parameters.SqlParameters;
+import org.apache.dolphinscheduler.service.cron.CronUtils;
import org.apache.dolphinscheduler.service.model.TaskNode;
import org.apache.dolphinscheduler.service.process.ProcessService;
@@ -2607,7 +2608,7 @@ public class ProcessDefinitionServiceImpl extends
BaseServiceImpl implements Pro
putMsg(result, Status.SCHEDULE_START_TIME_END_TIME_SAME);
return result;
}
- if
(!org.quartz.CronExpression.isValidExpression(scheduleObj.getCrontab())) {
+ if (!CronUtils.isValidExpression(scheduleObj.getCrontab())) {
log.error("CronExpression verify failure, cron:{}.",
scheduleObj.getCrontab());
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR,
scheduleObj.getCrontab());
return result;
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
index 1251add8c1..32d4821f60 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
@@ -75,7 +75,6 @@ import java.util.stream.Collectors;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
-import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -182,7 +181,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl
implements SchedulerSe
scheduleObj.setStartTime(scheduleParam.getStartTime());
scheduleObj.setEndTime(scheduleParam.getEndTime());
- if
(!org.quartz.CronExpression.isValidExpression(scheduleParam.getCrontab())) {
+ if (!CronUtils.isValidExpression(scheduleParam.getCrontab())) {
log.error("Schedule crontab verify failure, crontab:{}.",
scheduleParam.getCrontab());
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR,
scheduleParam.getCrontab());
return result;
@@ -238,7 +237,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl
implements SchedulerSe
if (scheduleParam.getStartTime().getTime() >
scheduleParam.getEndTime().getTime()) {
throw new
ServiceException(Status.START_TIME_BIGGER_THAN_END_TIME_ERROR);
}
- if (!CronExpression.isValidExpression(scheduleParam.getCrontab())) {
+ if (!CronUtils.isValidExpression(scheduleParam.getCrontab())) {
throw new ServiceException(Status.SCHEDULE_CRON_CHECK_FAILED,
scheduleParam.getCrontab());
}
}
@@ -828,7 +827,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl
implements SchedulerSe
schedule.setStartTime(scheduleParam.getStartTime());
schedule.setEndTime(scheduleParam.getEndTime());
- if
(!org.quartz.CronExpression.isValidExpression(scheduleParam.getCrontab())) {
+ if (!CronUtils.isValidExpression(scheduleParam.getCrontab())) {
log.error("Schedule crontab verify failure, crontab:{}.",
scheduleParam.getCrontab());
putMsg(result, Status.SCHEDULE_CRON_CHECK_FAILED,
scheduleParam.getCrontab());
return;
diff --git
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
index 48ddefc6f6..a510f42cd4 100644
---
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
+++
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
@@ -242,6 +242,14 @@ public class SchedulerServiceTest extends
BaseServiceTestTool {
() -> schedulerService.createSchedulesV2(user,
scheduleCreateRequest));
Assertions.assertEquals(Status.SCHEDULE_CRON_CHECK_FAILED.getCode(),
((ServiceException) exception).getCode());
+ // error schedule crontab
+ String badCrontab2 = "0 0 13/0 * * ? *";
+ scheduleCreateRequest.setStartTime(startTime);
+ scheduleCreateRequest.setCrontab(badCrontab2);
+ exception = Assertions.assertThrows(ServiceException.class,
+ () -> schedulerService.createSchedulesV2(user,
scheduleCreateRequest));
+ Assertions.assertEquals(Status.SCHEDULE_CRON_CHECK_FAILED.getCode(),
((ServiceException) exception).getCode());
+
// error create error
scheduleCreateRequest.setCrontab(crontab);
Mockito.when(scheduleMapper.insert(isA(Schedule.class))).thenReturn(0);
diff --git
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java
index 0ffb483a1a..c76bb773ef 100644
---
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java
+++
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/cron/CronUtils.java
@@ -79,11 +79,29 @@ public class CronUtils {
public static Cron parse2Cron(String cronExpression) throws
CronParseException {
try {
return QUARTZ_CRON_PARSER.parse(cronExpression);
- } catch (Exception ex) {
+ } catch (IllegalArgumentException ex) {
throw new CronParseException(String.format("Parse corn expression:
[%s] error", cronExpression), ex);
}
}
+ /**
+ * Indicates whether the specified cron expression can be parsed into a
+ * valid cron expression
+ *
+ * @param cronExpression the expression to evaluate
+ * @return a boolean indicating whether the given expression is a valid
cron
+ * expression
+ */
+ public static boolean isValidExpression(String cronExpression) {
+ try {
+ parse2Cron(cronExpression);
+ } catch (CronParseException e) {
+ return false;
+ }
+
+ return true;
+ }
+
/**
* get max cycle
*
diff --git
a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java
b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java
index 6be6d95459..5aec41f93e 100644
---
a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java
+++
b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/cron/CronUtilsTest.java
@@ -245,4 +245,10 @@ public class CronUtilsTest {
expirationTime = CronUtils.getExpirationTime(startTime,
CycleEnum.YEAR);
Assertions.assertEquals("2020-02-07 18:30:00",
DateUtils.dateToString(expirationTime));
}
+
+ @Test
+ public void testValid() {
+ Assertions.assertFalse(CronUtils.isValidExpression("0 0 13/0 * * ?
*"));
+ Assertions.assertTrue(CronUtils.isValidExpression("0 0 13-0 * * ? *"));
+ }
}