Skip to content

Commit 54a19b3

Browse files
authored
[Bug][Timezone][3.0.1] fix timezone when complement data and preview (#12093)
* fix timezone in complement data and schedule preview * fix timezone in complement data and schedule preview * code improvement
1 parent b3c27ef commit 54a19b3

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

Diff for: dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java

+25-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.dolphinscheduler.api.service.impl;
1919

2020
import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_END_DATE;
21+
import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST;
2122
import static org.apache.dolphinscheduler.common.Constants.CMDPARAM_COMPLEMENT_DATA_START_DATE;
2223
import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_RECOVER_PROCESS_ID_STRING;
2324
import static org.apache.dolphinscheduler.common.Constants.CMD_PARAM_START_NODES;
@@ -77,13 +78,15 @@
7778
import org.apache.commons.collections.MapUtils;
7879
import org.apache.commons.lang.StringUtils;
7980

81+
import java.time.ZoneId;
8082
import java.util.ArrayList;
8183
import java.util.Date;
8284
import java.util.HashMap;
8385
import java.util.HashSet;
8486
import java.util.List;
8587
import java.util.Map;
8688
import java.util.Set;
89+
import java.util.TimeZone;
8790
import java.util.stream.Collectors;
8891

8992
import org.slf4j.Logger;
@@ -704,14 +707,16 @@ protected int createComplementCommandList(Date start, Date end, RunMode runMode,
704707
logger.warn("The startDate {} is later than the endDate {}", start, end);
705708
break;
706709
}
707-
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(start));
708-
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(end));
709-
command.setCommandParam(JSONUtils.toJsonString(cmdParam));
710-
createCount = processService.createCommand(command);
711710

712711
// dependent process definition
713712
List<Schedule> schedules = processService.queryReleaseSchedulerListByProcessDefinitionCode(command.getProcessDefinitionCode());
714713

714+
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(start, ZoneId.systemDefault().getId()));
715+
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(end, ZoneId.systemDefault().getId()));
716+
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST, JSONUtils.toJsonString(CronUtils.getSelfFireDateList(start, end, schedules)));
717+
command.setCommandParam(JSONUtils.toJsonString(cmdParam));
718+
createCount = processService.createCommand(command);
719+
715720
if (schedules.isEmpty() || complementDependentMode == ComplementDependentMode.OFF_MODE) {
716721
logger.info("process code: {} complement dependent in off mode or schedule's size is 0, skip "
717722
+ "dependent complement data", command.getProcessDefinitionCode());
@@ -727,6 +732,8 @@ protected int createComplementCommandList(Date start, Date end, RunMode runMode,
727732
break;
728733
}
729734

735+
logger.info("before createComplementCommandList {} {}", start, end);
736+
730737
List<Date> listDate = new ArrayList<>();
731738
List<Schedule> schedules = processService.queryReleaseSchedulerListByProcessDefinitionCode(command.getProcessDefinitionCode());
732739
listDate.addAll(CronUtils.getSelfFireDateList(start, end, schedules));
@@ -759,9 +766,21 @@ protected int createComplementCommandList(Date start, Date end, RunMode runMode,
759766
endDateIndex += singleCommandItems;
760767
}
761768

762-
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(listDate.get(startDateIndex)));
763-
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(listDate.get(endDateIndex)));
769+
Date startDate = listDate.get(startDateIndex);
770+
Date endDate = listDate.get(endDateIndex);
771+
772+
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_START_DATE, DateUtils.dateToString(startDate, ZoneId.systemDefault().getId()));
773+
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_END_DATE, DateUtils.dateToString(endDate, ZoneId.systemDefault().getId()));
774+
cmdParam.put(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST, JSONUtils.toJsonString(CronUtils.getSelfFireDateList(startDate, endDate, schedules)));
764775
command.setCommandParam(JSONUtils.toJsonString(cmdParam));
776+
777+
logger.info("before create complement command: startDate:{}, startStr:{}, endDate:{}, endStr:{}, complement date list: {}",
778+
listDate.get(startDateIndex),
779+
cmdParam.get(CMDPARAM_COMPLEMENT_DATA_START_DATE),
780+
listDate.get(endDateIndex),
781+
cmdParam.get(CMDPARAM_COMPLEMENT_DATA_END_DATE),
782+
cmdParam.get(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST));
783+
765784
processService.createCommand(command);
766785

767786
if (schedules.isEmpty() || complementDependentMode == ComplementDependentMode.OFF_MODE) {

Diff for: dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.dolphinscheduler.common.enums.UserType;
3535
import org.apache.dolphinscheduler.common.enums.WarningType;
3636
import org.apache.dolphinscheduler.common.model.Server;
37+
import org.apache.dolphinscheduler.common.thread.ThreadLocalContext;
3738
import org.apache.dolphinscheduler.common.utils.DateUtils;
3839
import org.apache.dolphinscheduler.common.utils.JSONUtils;
3940
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
@@ -53,11 +54,13 @@
5354
import org.apache.commons.lang.StringUtils;
5455

5556
import java.text.ParseException;
57+
import java.time.ZoneId;
5658
import java.util.ArrayList;
5759
import java.util.Date;
5860
import java.util.HashMap;
5961
import java.util.List;
6062
import java.util.Map;
63+
import java.util.TimeZone;
6164

6265
import org.quartz.CronExpression;
6366
import org.quartz.JobKey;
@@ -578,11 +581,13 @@ public Map<String, Object> previewSchedule(User loginUser, String schedule) {
578581

579582
try {
580583
cronExpression = CronUtils.parse2CronExpression(scheduleParam.getCrontab());
584+
cronExpression.setTimeZone(TimeZone.getTimeZone(scheduleParam.getTimezoneId()));
581585
} catch (ParseException e) {
582586
logger.error(e.getMessage(), e);
583587
putMsg(result, Status.PARSE_TO_CRON_EXPRESSION_ERROR);
584588
return result;
585589
}
590+
586591
List<Date> selfFireDateList = CronUtils.getSelfFireDateList(startTime, endTime, cronExpression, Constants.PREVIEW_SCHEDULE_EXECUTE_COUNT);
587592
List<String> previewDateList = new ArrayList<>();
588593
selfFireDateList.forEach(date -> previewDateList.add(DateUtils.dateToString(date, scheduleParam.getTimezoneId())));

Diff for: dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/runner/WorkflowExecuteRunnable.java

+3-14
Original file line numberDiff line numberDiff line change
@@ -622,9 +622,7 @@ private int createComplementDataCommand(Date scheduleDate) {
622622
}
623623

624624
if (cmdParam.containsKey(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST)) {
625-
cmdParam.replace(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST,
626-
cmdParam.get(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST)
627-
.substring(cmdParam.get(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST).indexOf(COMMA) + 1));
625+
cmdParam.replace(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST, JSONUtils.toJsonString(complementListDate.subList(1, complementListDate.size())));
628626
}
629627

630628
if (cmdParam.containsKey(CMDPARAM_COMPLEMENT_DATA_START_DATE)) {
@@ -848,18 +846,9 @@ private void initTaskQueue() throws StateEventHandleException {
848846
// reset global params while there are start parameters
849847
setGlobalParamIfCommanded(processDefinition, cmdParam);
850848

851-
Date start = null;
852-
Date end = null;
853-
if(cmdParam.containsKey(CMDPARAM_COMPLEMENT_DATA_START_DATE) && cmdParam.containsKey(CMDPARAM_COMPLEMENT_DATA_END_DATE)){
854-
start = DateUtils.stringToDate(cmdParam.get(CMDPARAM_COMPLEMENT_DATA_START_DATE));
855-
end = DateUtils.stringToDate(cmdParam.get(CMDPARAM_COMPLEMENT_DATA_END_DATE));
856-
}
857-
List<Schedule> schedules = processService.queryReleaseSchedulerListByProcessDefinitionCode(processInstance.getProcessDefinitionCode());
858849
if (complementListDate.isEmpty() && needComplementProcess()) {
859-
complementListDate = CronUtils.getSelfFireDateList(start, end, schedules);
860-
logger.info(" process definition code:{} complement data: {}",
861-
processInstance.getProcessDefinitionCode(),
862-
complementListDate.toString());
850+
complementListDate = JSONUtils.toList(cmdParam.get(CMDPARAM_COMPLEMENT_DATA_SCHEDULE_DATE_LIST), Date.class);
851+
logger.info("process definition code:{}, complement data: {}", processInstance.getProcessDefinitionCode(), complementListDate.toString());
863852

864853
if (!complementListDate.isEmpty() && Flag.NO == processInstance.getIsSubProcess()) {
865854
processInstance.setScheduleTime(complementListDate.get(0));

Diff for: dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/quartz/cron/CronUtils.java

+7
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,22 @@
2929
import org.apache.dolphinscheduler.common.Constants;
3030
import org.apache.dolphinscheduler.common.enums.CycleEnum;
3131
import org.apache.dolphinscheduler.common.thread.Stopper;
32+
import org.apache.dolphinscheduler.common.thread.ThreadLocalContext;
3233
import org.apache.dolphinscheduler.common.utils.DateUtils;
3334
import org.apache.dolphinscheduler.dao.entity.Schedule;
3435

3536
import org.apache.commons.collections.CollectionUtils;
37+
import org.apache.commons.lang.StringUtils;
3638

3739
import java.text.ParseException;
40+
import java.time.ZoneId;
3841
import java.util.ArrayList;
3942
import java.util.Calendar;
4043
import java.util.Collections;
4144
import java.util.Date;
4245
import java.util.GregorianCalendar;
4346
import java.util.List;
47+
import java.util.TimeZone;
4448

4549
import org.quartz.CronExpression;
4650
import org.slf4j.Logger;
@@ -225,6 +229,9 @@ public static List<Date> getSelfFireDateList(Date startTime, Date endTime, Strin
225229
logger.error(e.getMessage(), e);
226230
return Collections.emptyList();
227231
}
232+
String timezone = ThreadLocalContext.getTimezoneThreadLocal().get();
233+
ZoneId zoneId = StringUtils.isNotEmpty(timezone) ? ZoneId.of(timezone) : ZoneId.systemDefault();
234+
cronExpression.setTimeZone(TimeZone.getTimeZone(zoneId));
228235
return getSelfFireDateList(startTime, endTime, cronExpression);
229236
}
230237

0 commit comments

Comments
 (0)