From e860e747174862b68ac63dfb4c7b671164017c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E5=85=AB?= Date: Sat, 18 Jul 2020 22:50:35 +0800 Subject: [PATCH] [fix] remove all DateFromat in worker (fix the bug of secondly job's time error) --- powerjob-client/pom.xml | 4 +- powerjob-common/pom.xml | 2 +- .../powerjob/common/model/InstanceDetail.java | 11 ++- .../powerjob/common/utils/CommonUtils.java | 19 +++- powerjob-server/pom.xml | 4 +- .../service/instance/InstanceService.java | 2 +- .../web/controller/InstanceController.java | 6 +- .../server/web/response/InstanceDetailVO.java | 98 +++++++++++++++++++ powerjob-worker-agent/pom.xml | 4 +- powerjob-worker-samples/pom.xml | 4 +- .../src/main/resources/application.properties | 2 +- powerjob-worker/pom.xml | 4 +- .../tracker/task/FrequentTaskTracker.java | 9 -- 13 files changed, 139 insertions(+), 30 deletions(-) create mode 100644 powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/InstanceDetailVO.java diff --git a/powerjob-client/pom.xml b/powerjob-client/pom.xml index 376f6977..39ee4363 100644 --- a/powerjob-client/pom.xml +++ b/powerjob-client/pom.xml @@ -10,11 +10,11 @@ 4.0.0 powerjob-client - 3.1.3 + 3.2.0 jar - 3.1.3 + 3.2.0 5.6.1 diff --git a/powerjob-common/pom.xml b/powerjob-common/pom.xml index b4ebcc1f..3e8766b4 100644 --- a/powerjob-common/pom.xml +++ b/powerjob-common/pom.xml @@ -10,7 +10,7 @@ 4.0.0 powerjob-common - 3.1.3 + 3.2.0 jar diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/InstanceDetail.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/InstanceDetail.java index c9ab4eaa..efa4686f 100644 --- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/InstanceDetail.java +++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/InstanceDetail.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; import java.util.List; /** - * 任务实例的运行详细信息(对外) + * 任务实例的运行详细信息 * * @author tjq * @since 2020/4/11 @@ -20,7 +20,7 @@ public class InstanceDetail implements OmsSerializable { private Long actualTriggerTime; // 任务整体结束时间(可能不存在) private Long finishedTime; - // 任务状态(中文) + // 任务状态 private Integer status; // 任务执行结果(可能不存在) private String result; @@ -35,13 +35,16 @@ public class InstanceDetail implements OmsSerializable { // 重试次数 private Long runningTimes; + // 扩展字段,中间件升级不易,最好不要再改 common 包了...否则 server worker 版本不兼容 + private String extra; + // 秒级任务的 extra -> List @Data @NoArgsConstructor public static class SubInstanceDetail implements OmsSerializable { private long subInstanceId; - private String startTime; - private String finishedTime; + private Long startTime; + private Long finishedTime; private String result; private int status; } diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java index 52277188..4627ee53 100644 --- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java +++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java @@ -1,11 +1,12 @@ package com.github.kfcfans.powerjob.common.utils; +import com.github.kfcfans.powerjob.common.OmsConstant; import com.github.kfcfans.powerjob.common.OmsException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import java.util.Collection; -import java.util.Objects; import java.util.function.Supplier; @@ -129,4 +130,20 @@ public class CommonUtils { return obj; } + /** + * 格式化时间,将时间戳转化为可阅读时间 + * @param ts 时间戳 + * @return 可阅读时间 + */ + public static String formatTime(Long ts) { + if (ts == null || ts <= 0) { + return OmsConstant.NONE; + } + try { + return DateFormatUtils.format(ts, OmsConstant.TIME_PATTERN); + }catch (Exception ignore) { + } + return OmsConstant.NONE; + } + } diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml index 7f3cdbf5..86e187f4 100644 --- a/powerjob-server/pom.xml +++ b/powerjob-server/pom.xml @@ -10,13 +10,13 @@ 4.0.0 powerjob-server - 3.1.3 + 3.2.0 jar 2.9.2 2.2.6.RELEASE - 3.1.3 + 3.2.0 8.0.19 1.4.200 2.5.2 diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java index 526e4ac6..c152a321 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java @@ -194,7 +194,7 @@ public class InstanceService { } }catch (Exception e) { - log.error("[Instance-{}] ask InstanceStatus from TaskTracker failed, exception is {}", instanceId, e.toString()); + log.warn("[Instance-{}] ask InstanceStatus from TaskTracker failed, exception is {}", instanceId, e.toString()); } // 失败则返回基础版信息 diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java index 537710e8..500a2ab5 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java @@ -1,7 +1,6 @@ package com.github.kfcfans.powerjob.server.web.controller; import com.github.kfcfans.powerjob.common.InstanceStatus; -import com.github.kfcfans.powerjob.common.model.InstanceDetail; import com.github.kfcfans.powerjob.common.response.ResultDTO; import com.github.kfcfans.powerjob.server.akka.OhMyServer; import com.github.kfcfans.powerjob.server.common.utils.OmsFileUtils; @@ -15,6 +14,7 @@ import com.github.kfcfans.powerjob.server.service.CacheService; import com.github.kfcfans.powerjob.server.service.InstanceLogService; import com.github.kfcfans.powerjob.server.service.instance.InstanceService; import com.github.kfcfans.powerjob.server.web.request.QueryInstanceRequest; +import com.github.kfcfans.powerjob.server.web.response.InstanceDetailVO; import com.github.kfcfans.powerjob.server.web.response.InstanceInfoVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; @@ -65,8 +65,8 @@ public class InstanceController { } @GetMapping("/detail") - public ResultDTO getInstanceDetail(String instanceId) { - return ResultDTO.success(instanceService.getInstanceDetail(Long.valueOf(instanceId))); + public ResultDTO getInstanceDetail(String instanceId) { + return ResultDTO.success(InstanceDetailVO.from(instanceService.getInstanceDetail(Long.valueOf(instanceId)))); } @GetMapping("/log") diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/InstanceDetailVO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/InstanceDetailVO.java new file mode 100644 index 00000000..4e31eabd --- /dev/null +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/InstanceDetailVO.java @@ -0,0 +1,98 @@ +package com.github.kfcfans.powerjob.server.web.response; + +import com.github.kfcfans.powerjob.common.OmsSerializable; +import com.github.kfcfans.powerjob.common.model.InstanceDetail; +import com.github.kfcfans.powerjob.common.utils.CommonUtils; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +/** + * 任务实例的运行详细信息(对外展示对象) + * 注意:日期的格式化全部需要在 server 完成,不能在浏览器完成,否则会有时区问题(当 server 与 browser 时区不一致时显示会有问题) + * + * @author 朱八 + * @since 2020/7/18 + */ +@Data +@NoArgsConstructor +public class InstanceDetailVO { + + // 任务整体开始时间 + private String actualTriggerTime; + // 任务整体结束时间(可能不存在) + private String finishedTime; + // 任务状态 + private Integer status; + // 任务执行结果(可能不存在) + private String result; + // TaskTracker地址 + private String taskTrackerAddress; + + // MR或BD任务专用 + private InstanceDetailVO.TaskDetail taskDetail; + // 秒级任务专用 + private List subInstanceDetails; + + // 重试次数 + private Long runningTimes; + + // 秒级任务的 extra -> List + @Data + @NoArgsConstructor + public static class SubInstanceDetail implements OmsSerializable { + private long subInstanceId; + private String startTime; + private String finishedTime; + private String result; + private int status; + } + + // MapReduce 和 Broadcast 任务的 extra -> + @Data + @NoArgsConstructor + public static class TaskDetail implements OmsSerializable { + private long totalTaskNum; + private long succeedTaskNum; + private long failedTaskNum; + } + + public static InstanceDetailVO from(InstanceDetail origin) { + InstanceDetailVO vo = new InstanceDetailVO(); + BeanUtils.copyProperties(origin, vo); + + // 格式化时间 + vo.setFinishedTime(CommonUtils.formatTime(origin.getFinishedTime())); + vo.setActualTriggerTime(CommonUtils.formatTime(origin.getActualTriggerTime())); + + // 拷贝 TaskDetail + if (origin.getTaskDetail() != null) { + TaskDetail voDetail = new TaskDetail(); + BeanUtils.copyProperties(origin.getTaskDetail(), voDetail); + vo.setTaskDetail(voDetail); + } + + // 拷贝秒级任务数据 + if (!CollectionUtils.isEmpty(origin.getSubInstanceDetails())) { + vo.subInstanceDetails = Lists.newLinkedList(); + + origin.getSubInstanceDetails().forEach(subDetail -> { + + SubInstanceDetail voSubDetail = new SubInstanceDetail(); + BeanUtils.copyProperties(subDetail, voSubDetail); + + // 格式化时间 + voSubDetail.setStartTime(CommonUtils.formatTime(subDetail.getStartTime())); + voSubDetail.setFinishedTime(CommonUtils.formatTime(subDetail.getFinishedTime())); + + vo.subInstanceDetails.add(voSubDetail); + }); + } + + return vo; + } +} diff --git a/powerjob-worker-agent/pom.xml b/powerjob-worker-agent/pom.xml index 4efd4128..4b4c7db2 100644 --- a/powerjob-worker-agent/pom.xml +++ b/powerjob-worker-agent/pom.xml @@ -10,12 +10,12 @@ 4.0.0 powerjob-worker-agent - 3.1.3 + 3.2.0 jar - 3.1.3 + 3.2.0 1.2.3 4.3.2 diff --git a/powerjob-worker-samples/pom.xml b/powerjob-worker-samples/pom.xml index b6dc739a..e11ca2cc 100644 --- a/powerjob-worker-samples/pom.xml +++ b/powerjob-worker-samples/pom.xml @@ -10,11 +10,11 @@ 4.0.0 powerjob-worker-samples - 3.1.3 + 3.2.0 2.2.6.RELEASE - 3.1.3 + 3.2.0 1.2.68 diff --git a/powerjob-worker-samples/src/main/resources/application.properties b/powerjob-worker-samples/src/main/resources/application.properties index 7d804f17..1f34c49a 100644 --- a/powerjob-worker-samples/src/main/resources/application.properties +++ b/powerjob-worker-samples/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.port=8081 +server.port=8082 spring.jpa.open-in-view=false diff --git a/powerjob-worker/pom.xml b/powerjob-worker/pom.xml index 6e7e9236..e4b55ef1 100644 --- a/powerjob-worker/pom.xml +++ b/powerjob-worker/pom.xml @@ -10,12 +10,12 @@ 4.0.0 powerjob-worker - 3.1.3 + 3.2.0 jar 5.2.4.RELEASE - 3.1.3 + 3.2.0 1.4.200 3.4.2 5.6.1 diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/FrequentTaskTracker.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/FrequentTaskTracker.java index ed72f3f9..3e484b84 100644 --- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/FrequentTaskTracker.java +++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/FrequentTaskTracker.java @@ -17,7 +17,6 @@ import com.google.common.collect.Maps; import com.google.common.util.concurrent.ThreadFactoryBuilder; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.BeanUtils; import org.springframework.util.StringUtils; @@ -121,14 +120,6 @@ public class FrequentTaskTracker extends TaskTracker { subDetail.setStatus(status.getV()); subDetail.setSubInstanceId(subId); - // 设置时间 - subDetail.setStartTime(DateFormatUtils.format(subInstanceInfo.getStartTime(), OmsConstant.TIME_PATTERN)); - if (status == InstanceStatus.SUCCEED || status == InstanceStatus.FAILED) { - subDetail.setFinishedTime(DateFormatUtils.format(subInstanceInfo.getFinishedTime(), OmsConstant.TIME_PATTERN)); - }else { - subDetail.setFinishedTime("N/A"); - } - history.add(subDetail); });