diff --git a/README.md b/README.md
index d8236934..2eaabf71 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ PowerJob(原OhMyScheduler)是全新一代分布式调度与计算框架,
| 日志白屏化 | 不支持 | 支持 | 不支持 | **支持** |
| 调度方式及性能 | 基于数据库锁,有性能瓶颈 | 基于数据库锁,有性能瓶颈 | 不详 | **无锁化设计,性能强劲无上限** |
| 报警监控 | 无 | 邮件 | 短信 | **邮件,提供接口允许开发者扩展** |
-| 系统依赖 | MySQL | MySQL | 人民币(公测期间免费,哎,帮打个广告吧) | **任意Spring Data Jpa支持的关系型数据库(MySQL、Oracle...)** |
+| 系统依赖 | JDBC支持的关系型数据库(MySQL、Oracle...) | MySQL | 人民币(公测期间免费,哎,帮打个广告吧) | **任意Spring Data Jpa支持的关系型数据库(MySQL、Oracle...)** |
| DAG工作流 | 不支持 | 不支持 | 支持 | **支持** |
diff --git a/README_enUS.md b/README_enUS.md
index 94975add..aed3811c 100644
--- a/README_enUS.md
+++ b/README_enUS.md
@@ -1,13 +1,15 @@
-
+
-
-
+
+
+
+
-OhMyScheduler is a powerful distributed scheduling platform and distributed computing framework based on Akka architecture.It provides you a chance to schedule job and distributed computing easily.
+PowerJob is a powerful distributed scheduling platform and distributed computing framework based on Akka architecture.It provides you a chance to schedule job and distributed computing easily.
# Introduction
@@ -30,7 +32,7 @@ OhMyScheduler is a powerful distributed scheduling platform and distributed comp
### Comparison of similar products
-| | QuartZ | xxl-job | SchedulerX 2.0 | OhMyScheduler |
+| | QuartZ | xxl-job | SchedulerX 2.0 | PowerJob |
| ---------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Timing type | CRON | CRON | CRON, fixed frequency, fixed delay, OpenAPI | **CRON, fixed frequency, fixed delay, OpenAPI** |
| Task type | Built-in Java | Built-in Java, GLUE Java, Shell, Python and other scripts | Built-in Java, external Java (FatJar), Shell, Python and other scripts | **Built-in Java, external Java (container), Shell, Python and other scripts** |
@@ -39,13 +41,13 @@ OhMyScheduler is a powerful distributed scheduling platform and distributed comp
| Log blanking | not support | support | not support | **support** |
| Scheduling methods and performance | Based on database lock, there is a performance bottleneck | Based on database lock, there is a performance bottleneck | Unknown | **Lock-free design, powerful performance without upper limit** |
| Alarm monitoring | no | mail | SMS | **Email, providing an interface to allow developers to customize development** |
-| System dependence | MySQL | MySQL | Renminbi (free during public beta, hey, help to advertise) | **Any relational database (MySQL, Oracle ...) supported by Spring Data Jpa** |
-| DAG workflow | not support | not support | support | **support** |
+| System dependence | Any relational database (MySQL, Oracle ...) supported by JDBC | MySQL | Renminbi (free during public beta, hey, help to advertise) | **Any relational database (MySQL, Oracle ...) supported by Spring Data Jpa** |
+| workflow | not support | not support | support | **support** |
# Document
-**[GitHub Wiki](https://github.com/KFCFans/OhMyScheduler/wiki)**
+**[GitHub Wiki](https://github.com/KFCFans/PowerJob/wiki)**
-**[中文文档](https://www.yuque.com/ohmyscheduler/product)**
+**[中文文档](https://www.yuque.com/powerjob/product)**
# Others
diff --git a/powerjob-client/pom.xml b/powerjob-client/pom.xml
index bf2c173e..951ca22b 100644
--- a/powerjob-client/pom.xml
+++ b/powerjob-client/pom.xml
@@ -10,11 +10,11 @@
4.0.0
powerjob-client
- 3.0.1
+ 3.1.0
jar
- 3.0.1
+ 3.1.0
5.6.1
diff --git a/powerjob-client/src/main/java/com/github/kfcfans/powerjob/client/OhMyClient.java b/powerjob-client/src/main/java/com/github/kfcfans/powerjob/client/OhMyClient.java
index fbb0c1e4..b6ee21b8 100644
--- a/powerjob-client/src/main/java/com/github/kfcfans/powerjob/client/OhMyClient.java
+++ b/powerjob-client/src/main/java/com/github/kfcfans/powerjob/client/OhMyClient.java
@@ -15,6 +15,7 @@ import okhttp3.MediaType;
import okhttp3.RequestBody;
import org.apache.commons.lang3.StringUtils;
+import java.io.IOException;
import java.util.List;
import java.util.Objects;
@@ -39,8 +40,8 @@ public class OhMyClient {
* @param domain www.oms-server.com(内网域名,自行完成DNS & Proxy)
* @param appName 负责的应用名称
*/
- public OhMyClient(String domain, String appName) {
- this(Lists.newArrayList(domain), appName);
+ public OhMyClient(String domain, String appName, String password) {
+ this(Lists.newArrayList(domain), appName, password);
}
@@ -49,16 +50,16 @@ public class OhMyClient {
* @param addressList IP:Port 列表
* @param appName 负责的应用名称
*/
- public OhMyClient(List addressList, String appName) {
+ public OhMyClient(List addressList, String appName, String password) {
Objects.requireNonNull(addressList, "domain can't be null!");
Objects.requireNonNull(appName, "appName can't be null");
allAddress = addressList;
for (String addr : addressList) {
- String url = getUrl(OpenAPIConstant.ASSERT, addr) + "?appName=" + appName;
+ String url = getUrl(OpenAPIConstant.ASSERT, addr);
try {
- String result = HttpUtils.get(url);
+ String result = assertApp(appName, password, url);
if (StringUtils.isNotEmpty(result)) {
ResultDTO resultDTO = JsonUtils.parseObject(result, ResultDTO.class);
if (resultDTO.isSuccess()) {
@@ -77,6 +78,15 @@ public class OhMyClient {
log.info("[OhMyClient] {}'s oms-client bootstrap successfully.", appName);
}
+ private static String assertApp(String appName, String password, String url) throws IOException {
+ FormBody.Builder builder = new FormBody.Builder()
+ .add("appName", appName);
+ if (password != null) {
+ builder.add("password", password);
+ }
+ return HttpUtils.post(url, builder.build());
+ }
+
private static String getUrl(String path, String address) {
return String.format(URL_PATTERN, address, OpenAPIConstant.WEB_PATH, path);
diff --git a/powerjob-client/src/test/java/TestClient.java b/powerjob-client/src/test/java/TestClient.java
index 8edae482..2306dffc 100644
--- a/powerjob-client/src/test/java/TestClient.java
+++ b/powerjob-client/src/test/java/TestClient.java
@@ -21,7 +21,7 @@ public class TestClient {
@BeforeAll
public static void initClient() throws Exception {
- ohMyClient = new OhMyClient("127.0.0.1:7700", "oms-test2");
+ ohMyClient = new OhMyClient("127.0.0.1:7700", "oms-test2", null);
}
@Test
@@ -29,7 +29,7 @@ public class TestClient {
SaveJobInfoRequest newJobInfo = new SaveJobInfoRequest();
// newJobInfo.setId(8L);
- newJobInfo.setJobName("omsOpenAPIJob");
+ newJobInfo.setJobName("omsOpenAPIJobccccc");
newJobInfo.setJobDescription("tes OpenAPI");
newJobInfo.setJobParams("{'aa':'bb'}");
newJobInfo.setTimeExpressionType(TimeExpressionType.CRON);
diff --git a/powerjob-client/src/test/java/TestWorkflow.java b/powerjob-client/src/test/java/TestWorkflow.java
index 64ef1e4d..3b5f2f75 100644
--- a/powerjob-client/src/test/java/TestWorkflow.java
+++ b/powerjob-client/src/test/java/TestWorkflow.java
@@ -20,7 +20,7 @@ public class TestWorkflow {
@BeforeAll
public static void initClient() throws Exception {
- ohMyClient = new OhMyClient("127.0.0.1:7700", "oms-test");
+ ohMyClient = new OhMyClient("127.0.0.1:7700", "oms-test", null);
}
@Test
diff --git a/powerjob-common/pom.xml b/powerjob-common/pom.xml
index be200502..0e9d02c1 100644
--- a/powerjob-common/pom.xml
+++ b/powerjob-common/pom.xml
@@ -10,7 +10,7 @@
4.0.0
powerjob-common
- 3.0.1
+ 3.1.0
jar
diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/request/http/WorkerNeedDeployContainerRequest.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/request/WorkerNeedDeployContainerRequest.java
similarity index 87%
rename from powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/request/http/WorkerNeedDeployContainerRequest.java
rename to powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/request/WorkerNeedDeployContainerRequest.java
index 52f0cdbe..412935d2 100644
--- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/request/http/WorkerNeedDeployContainerRequest.java
+++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/request/WorkerNeedDeployContainerRequest.java
@@ -1,4 +1,4 @@
-package com.github.kfcfans.powerjob.common.request.http;
+package com.github.kfcfans.powerjob.common.request;
import com.github.kfcfans.powerjob.common.OmsSerializable;
import lombok.AllArgsConstructor;
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index efb56e95..59d9120e 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -10,13 +10,13 @@
4.0.0
powerjob-server
- 3.0.1
+ 3.1.0
jar
2.9.2
2.2.6.RELEASE
- 3.0.1
+ 3.1.0
8.0.19
1.4.200
2.5.2
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/actors/ServerActor.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/actors/ServerActor.java
index ba5b876c..6acb41fb 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/actors/ServerActor.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/actors/ServerActor.java
@@ -6,7 +6,7 @@ import com.github.kfcfans.powerjob.common.request.ServerDeployContainerRequest;
import com.github.kfcfans.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
import com.github.kfcfans.powerjob.common.request.WorkerHeartbeat;
import com.github.kfcfans.powerjob.common.request.WorkerLogReportReq;
-import com.github.kfcfans.powerjob.common.request.http.WorkerNeedDeployContainerRequest;
+import com.github.kfcfans.powerjob.common.request.WorkerNeedDeployContainerRequest;
import com.github.kfcfans.powerjob.common.response.AskResponse;
import com.github.kfcfans.powerjob.common.utils.JsonUtils;
import com.github.kfcfans.powerjob.common.utils.NetUtils;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java
index 401e1b2b..d018b36e 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java
@@ -21,7 +21,8 @@ public class AppInfoDO {
private Long id;
private String appName;
- private String description;
+ // 应用分组密码
+ private String password;
// 当前负责该 appName 旗下任务调度的server地址,IP:Port(注意,该地址为ActorSystem地址,而不是HTTP地址,两者端口不同)
private String currentServer;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/AppInfoService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/AppInfoService.java
new file mode 100644
index 00000000..2b0ec22a
--- /dev/null
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/AppInfoService.java
@@ -0,0 +1,38 @@
+package com.github.kfcfans.powerjob.server.service;
+
+import com.github.kfcfans.powerjob.common.OmsException;
+import com.github.kfcfans.powerjob.server.persistence.core.model.AppInfoDO;
+import com.github.kfcfans.powerjob.server.persistence.core.repository.AppInfoRepository;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+/**
+ * 应用信息服务
+ *
+ * @author tjq
+ * @since 2020/6/20
+ */
+@Service
+public class AppInfoService {
+
+ @Resource
+ private AppInfoRepository appInfoRepository;
+
+ /**
+ * 验证应用访问权限
+ * @param appName 应用名称
+ * @param password 密码
+ * @return 应用ID
+ */
+ public Long assertApp(String appName, String password) {
+
+ AppInfoDO appInfo = appInfoRepository.findByAppName(appName).orElseThrow(() -> new OmsException("can't find appInfo by appName: " + appName));
+ if (Objects.equals(appInfo.getPassword(), password)) {
+ return appInfo.getId();
+ }
+ throw new OmsException("password error!");
+ }
+
+}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/AppInfoController.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/AppInfoController.java
index d408a8d2..eb3f463d 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/AppInfoController.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/AppInfoController.java
@@ -3,6 +3,8 @@ package com.github.kfcfans.powerjob.server.web.controller;
import com.github.kfcfans.powerjob.common.response.ResultDTO;
import com.github.kfcfans.powerjob.server.persistence.core.model.AppInfoDO;
import com.github.kfcfans.powerjob.server.persistence.core.repository.AppInfoRepository;
+import com.github.kfcfans.powerjob.server.service.AppInfoService;
+import com.github.kfcfans.powerjob.server.web.request.AppAssertRequest;
import com.github.kfcfans.powerjob.server.web.request.ModifyAppInfoRequest;
import com.google.common.collect.Lists;
import lombok.Data;
@@ -29,6 +31,8 @@ import java.util.stream.Collectors;
@RequestMapping("/appInfo")
public class AppInfoController {
+ @Resource
+ private AppInfoService appInfoService;
@Resource
private AppInfoRepository appInfoRepository;
@@ -53,6 +57,11 @@ public class AppInfoController {
return ResultDTO.success(null);
}
+ @PostMapping("/assert")
+ public ResultDTO assertApp(@RequestBody AppAssertRequest request) {
+ return ResultDTO.success(appInfoService.assertApp(request.getAppName(), request.getPassword()));
+ }
+
@GetMapping("/delete")
public ResultDTO deleteAppInfo(Long appId) {
appInfoRepository.deleteById(appId);
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/OpenAPIController.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/OpenAPIController.java
index 5e7c1254..df4662c2 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/OpenAPIController.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/OpenAPIController.java
@@ -3,8 +3,7 @@ package com.github.kfcfans.powerjob.server.web.controller;
import com.github.kfcfans.powerjob.common.InstanceStatus;
import com.github.kfcfans.powerjob.common.OpenAPIConstant;
import com.github.kfcfans.powerjob.common.request.http.SaveWorkflowRequest;
-import com.github.kfcfans.powerjob.server.persistence.core.model.AppInfoDO;
-import com.github.kfcfans.powerjob.server.persistence.core.repository.AppInfoRepository;
+import com.github.kfcfans.powerjob.server.service.AppInfoService;
import com.github.kfcfans.powerjob.server.service.CacheService;
import com.github.kfcfans.powerjob.server.service.JobService;
import com.github.kfcfans.powerjob.server.service.instance.InstanceService;
@@ -15,7 +14,6 @@ import com.github.kfcfans.powerjob.common.response.*;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
-import java.util.Optional;
/**
* 开放接口(OpenAPI)控制器,对接 oms-client
@@ -27,6 +25,8 @@ import java.util.Optional;
@RequestMapping(OpenAPIConstant.WEB_PATH)
public class OpenAPIController {
+ @Resource
+ private AppInfoService appInfoService;
@Resource
private JobService jobService;
@Resource
@@ -39,14 +39,10 @@ public class OpenAPIController {
@Resource
private CacheService cacheService;
- @Resource
- private AppInfoRepository appInfoRepository;
- @GetMapping(OpenAPIConstant.ASSERT)
- public ResultDTO assertAppName(String appName) {
- Optional appInfoOpt = appInfoRepository.findByAppName(appName);
- return appInfoOpt.map(appInfoDO -> ResultDTO.success(appInfoDO.getId()))
- .orElseGet(() -> ResultDTO.failed(appName + " is not registered!"));
+ @PostMapping(OpenAPIConstant.ASSERT)
+ public ResultDTO assertAppName(String appName, @RequestParam(required = false) String password) {
+ return ResultDTO.success(appInfoService.assertApp(appName, password));
}
/* ************* Job 区 ************* */
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/AppAssertRequest.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/AppAssertRequest.java
new file mode 100644
index 00000000..88177320
--- /dev/null
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/AppAssertRequest.java
@@ -0,0 +1,15 @@
+package com.github.kfcfans.powerjob.server.web.request;
+
+import lombok.Data;
+
+/**
+ * 验证应用(应用登陆)
+ *
+ * @author tjq
+ * @since 2020/6/20
+ */
+@Data
+public class AppAssertRequest {
+ private String appName;
+ private String password;
+}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/ModifyAppInfoRequest.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/ModifyAppInfoRequest.java
index 84b5b4d6..aeacc5db 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/ModifyAppInfoRequest.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/request/ModifyAppInfoRequest.java
@@ -13,5 +13,5 @@ public class ModifyAppInfoRequest {
private Long id;
private String appName;
- private String description;
+ private String password;
}
diff --git a/powerjob-server/src/main/resources/static/js/4.js b/powerjob-server/src/main/resources/static/js/4.js
index 86dffefb..6292a25f 100644
--- a/powerjob-server/src/main/resources/static/js/4.js
+++ b/powerjob-server/src/main/resources/static/js/4.js
@@ -8,7 +8,7 @@
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Home\",\n data: function data() {\n return {\n systemInfo: {\n jobCount: \"N/A\",\n runningInstanceCount: \"N/A\",\n failedInstanceCount: \"N/A\",\n serverTime: undefined\n },\n activeWorkerCount: \"N/A\",\n workerList: []\n };\n },\n methods: {\n workerTableRowClassName: function workerTableRowClassName(_ref) {\n var row = _ref.row;\n\n switch (row.status) {\n case 1:\n return 'success-row';\n\n case 2:\n return 'warning-row';\n\n case 3:\n return 'error-row';\n }\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n var that = this;\n var appId = that.$store.state.appInfo.id; // 请求 Worker 列表\n\n that.axios.get(\"/system/listWorker?appId=\" + appId).then(function (res) {\n that.workerList = res;\n that.activeWorkerCount = that.workerList.length;\n }); // 请求 Overview\n\n that.axios.get(\"/system/overview?appId=\" + appId).then(function (res) {\n that.systemInfo = res; // 对比服务器时间和本地时间\n\n var localTime = new Date().getTime();\n var serverTime = res.serverTime;\n console.log(\"localTime: %o, serverTime: %o\", localTime, serverTime);\n var offset = localTime - serverTime; // 误差大于一分钟,弹窗告警\n\n if (Math.abs(offset) > 60000) {\n _this.$notify({\n title: '警告',\n message: '调度中心服务器与本地存在时间差,可能影响任务调度准确性,建议排查时间问题!',\n type: 'warning',\n duration: 0\n });\n }\n });\n }\n});\n\n//# sourceURL=webpack:///./src/components/views/Home.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Home\",\n data: function data() {\n return {\n systemInfo: {\n jobCount: \"N/A\",\n runningInstanceCount: \"N/A\",\n failedInstanceCount: \"N/A\",\n serverTime: undefined\n },\n activeWorkerCount: \"N/A\",\n workerList: []\n };\n },\n methods: {\n workerTableRowClassName: function workerTableRowClassName(_ref) {\n var row = _ref.row;\n\n switch (row.status) {\n case 1:\n return 'success-row';\n\n case 2:\n return 'warning-row';\n\n case 3:\n return 'error-row';\n }\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n var that = this;\n var appId = that.$store.state.appInfo.id; // 请求 Worker 列表\n\n that.axios.get(\"/system/listWorker?appId=\" + appId).then(function (res) {\n that.workerList = res;\n that.activeWorkerCount = that.workerList.length;\n }); // 请求 Overview\n\n that.axios.get(\"/system/overview?appId=\" + appId).then(function (res) {\n that.systemInfo = res; // 对比服务器时间和本地时间\n\n var localTime = new Date().getTime();\n var serverTime = res.serverTime;\n console.log(\"localTime: %o, serverTime: %o\", localTime, serverTime);\n var offset = localTime - serverTime; // 误差大于一分钟,弹窗告警\n\n if (Math.abs(offset) > 60000) {\n _this.$notify({\n title: '警告',\n message: '调度中心服务器与本地存在时间差,可能影响任务调度准确性,建议排查时间问题!',\n type: 'warning',\n duration: 0\n });\n }\n });\n }\n});\n\n//# sourceURL=webpack:///./src/components/views/Home.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -20,7 +20,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"home\" } },\n [\n _c(\n \"el-row\",\n { attrs: { gutter: 24 } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\"el-card\", { attrs: { shadow: \"always\" } }, [\n _vm._v(\n \" \" +\n _vm._s(_vm.$t(\"message.omsServerTime\")) +\n \":\" +\n _vm._s(\n this.common.timestamp2Str(_vm.systemInfo.serverTime)\n ) +\n \" \"\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\"el-card\", { attrs: { shadow: \"always\" } }, [\n _vm._v(\n \" \" +\n _vm._s(_vm.$t(\"message.localBrowserTime\")) +\n \":\" +\n _vm._s(this.common.timestamp2Str(new Date().getTime())) +\n \" \"\n )\n ])\n ],\n 1\n ),\n _c(\n \"a\",\n {\n attrs: {\n href: \"https://github.com/KFCFans/OhMyScheduler\",\n target: \"_blank\"\n }\n },\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-card\",\n {\n staticStyle: { \"text-align\": \"center\" },\n attrs: { shadow: \"always\" }\n },\n [_vm._v(\" \" + _vm._s(_vm.$t(\"message.githubURL\")) + \" \")]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"a\",\n {\n staticStyle: { \"text-align\": \"center\" },\n attrs: {\n href: \"https://www.yuque.com/ohmyscheduler/guidence\",\n target: \"_blank\"\n }\n },\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\"el-card\", { attrs: { shadow: \"always\" } }, [\n _vm._v(\" \" + _vm._s(_vm.$t(\"message.docURL\")) + \" \")\n ])\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n { attrs: { gutter: 24 } },\n [\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.totalJobNum\")))\n ]),\n _c(\"div\", { staticClass: \"text mText\" }, [\n _vm._v(_vm._s(_vm.systemInfo.jobCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-orange\" })\n ])\n ]),\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.runningInstanceNum\")))\n ]),\n _c(\"div\", { staticClass: \"text\" }, [\n _vm._v(_vm._s(_vm.systemInfo.runningInstanceCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-loading\" })\n ])\n ]),\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.recentFailedInstanceNum\")))\n ]),\n _c(\"div\", { staticClass: \"text\" }, [\n _vm._v(_vm._s(_vm.systemInfo.failedInstanceCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-bell\" })\n ])\n ]),\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.workerNum\")))\n ]),\n _c(\"div\", { staticClass: \"text\" }, [\n _vm._v(_vm._s(_vm.activeWorkerCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-cpu\" })\n ])\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 24 } },\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n data: _vm.workerList,\n height: \"400px\",\n \"row-class-name\": _vm.workerTableRowClassName\n }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"address\",\n label: _vm.$t(\"message.workerAddress\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"cpuLoad\", label: _vm.$t(\"message.cpuLoad\") }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"memoryLoad\",\n label: _vm.$t(\"message.memoryLoad\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"diskLoad\",\n label: _vm.$t(\"message.diskLoad\")\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/views/Home.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2241f1f4da-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { attrs: { id: \"home\" } },\n [\n _c(\n \"el-row\",\n { attrs: { gutter: 24 } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-card\",\n {\n staticStyle: { \"text-align\": \"center\" },\n attrs: { shadow: \"always\" }\n },\n [_vm._v(\" \" + _vm._s(this.$store.state.appInfo.appName) + \" \")]\n )\n ],\n 1\n ),\n _c(\n \"a\",\n {\n attrs: {\n href: \"https://github.com/KFCFans/PowerJob\",\n target: \"_blank\"\n }\n },\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-card\",\n {\n staticStyle: { \"text-align\": \"center\" },\n attrs: { shadow: \"always\" }\n },\n [_vm._v(\" \" + _vm._s(_vm.$t(\"message.githubURL\")) + \" \")]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\"el-card\", { attrs: { shadow: \"always\" } }, [\n _vm._v(\n \" \" +\n _vm._s(_vm.$t(\"message.omsServerTime\")) +\n \":\" +\n _vm._s(\n this.common.timestamp2Str(_vm.systemInfo.serverTime)\n ) +\n \" \"\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\"el-card\", { attrs: { shadow: \"always\" } }, [\n _vm._v(\n \" \" +\n _vm._s(_vm.$t(\"message.localBrowserTime\")) +\n \":\" +\n _vm._s(this.common.timestamp2Str(new Date().getTime())) +\n \" \"\n )\n ])\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n { attrs: { gutter: 24 } },\n [\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.totalJobNum\")))\n ]),\n _c(\"div\", { staticClass: \"text mText\" }, [\n _vm._v(_vm._s(_vm.systemInfo.jobCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-orange\" })\n ])\n ]),\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.runningInstanceNum\")))\n ]),\n _c(\"div\", { staticClass: \"text\" }, [\n _vm._v(_vm._s(_vm.systemInfo.runningInstanceCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-loading\" })\n ])\n ]),\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.recentFailedInstanceNum\")))\n ]),\n _c(\"div\", { staticClass: \"text\" }, [\n _vm._v(_vm._s(_vm.systemInfo.failedInstanceCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-bell\" })\n ])\n ]),\n _c(\"el-col\", { attrs: { span: 6 } }, [\n _c(\"div\", { staticClass: \"wrap\" }, [\n _c(\"div\", { staticClass: \"grid-content bg-purple\" }, [\n _c(\"div\", { staticClass: \"text mTitle\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.workerNum\")))\n ]),\n _c(\"div\", { staticClass: \"text\" }, [\n _vm._v(_vm._s(_vm.activeWorkerCount))\n ])\n ]),\n _c(\"i\", { staticClass: \"el-icon-cpu\" })\n ])\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 24 } },\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n data: _vm.workerList,\n height: \"400px\",\n \"row-class-name\": _vm.workerTableRowClassName\n }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"address\",\n label: _vm.$t(\"message.workerAddress\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"cpuLoad\", label: _vm.$t(\"message.cpuLoad\") }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"memoryLoad\",\n label: _vm.$t(\"message.memoryLoad\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"diskLoad\",\n label: _vm.$t(\"message.diskLoad\")\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/views/Home.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2241f1f4da-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -31,7 +31,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* 头部信息 */\\n.wrap[data-v-069f7be0] {\\n background: #fff;\\n display: flex;\\n text-align: center;\\n justify-content: space-around;\\n align-items: center;\\n margin: 10px;\\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);\\n font-size: 1.5rem;\\n font-weight: bolder;\\n height: 131px;\\n}\\n.mTitle[data-v-069f7be0]{\\n font-size: 20px;\\n color:#0f0f0fad;\\n margin-bottom: 8px;\\n}\\n.el-card[data-v-069f7be0] {\\n margin: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/views/Home.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* 头部信息 */\\n.wrap[data-v-069f7be0] {\\n background: #fff;\\n display: flex;\\n text-align: center;\\n justify-content: space-around;\\n align-items: center;\\n margin: 10px;\\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);\\n font-size: 1.5rem;\\n font-weight: bolder;\\n height: 131px;\\n}\\n.mTitle[data-v-069f7be0]{\\n font-size: 20px;\\n color:#0f0f0fad;\\n margin-bottom: 8px;\\n}\\n.el-card[data-v-069f7be0] {\\n margin: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/views/Home.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/6.js b/powerjob-server/src/main/resources/static/js/6.js
index e6120d61..072f1767 100644
--- a/powerjob-server/src/main/resources/static/js/6.js
+++ b/powerjob-server/src/main/resources/static/js/6.js
@@ -8,7 +8,7 @@
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Welcome\",\n data: function data() {\n return {\n // 下拉框被选中的数据\n selectedAppInfo: {},\n // 下拉框的选择列表数据\n appInfoList: [],\n // 应用注册表单是否可见\n appRegisterFormVisible: false,\n // 用户注册表单是否可见\n userRegisterFormVisible: false,\n // 应用注册表单对象\n appRegisterForm: {\n appName: \"\",\n description: \"\"\n },\n // 用户注册表单对象\n userRegisterForm: {\n username: \"\",\n phone: \"\",\n email: \"\"\n }\n };\n },\n methods: {\n // 请求应用下拉框数据\n fetchAppNames: function fetchAppNames(condition) {\n var that = this;\n var url = \"/appInfo/list?condition=\" + condition;\n this.axios.get(url).then(function (result) {\n that.appInfoList = result;\n }, function (error) {\n return that.$message.error(error);\n });\n },\n // 选中应用跳转\n selectedApp: function selectedApp() {\n // 将 appId 存储到 VueStore\n this.$store.commit(\"initAppInfo\", this.selectedAppInfo); // 跳转到主界面\n\n this.$router.push(\"/oms/home\");\n },\n // 注册应用\n registerApp: function registerApp() {\n var _this = this;\n\n var that = this;\n this.axios.post(\"/appInfo/save\", this.appRegisterForm).then(function () {\n that.$message.success(_this.$t('message.success'));\n that.appRegisterFormVisible = false;\n }, that.appRegisterFormVisible = false);\n },\n // 注册用户(仅用于报警通知)\n registerUser: function registerUser() {\n var _this2 = this;\n\n var that = this;\n this.axios.post(\"/user/save\", this.userRegisterForm).then(function () {\n that.$message.success(_this2.$t('message.success'));\n that.userRegisterFormVisible = false;\n }, that.userRegisterFormVisible = false);\n }\n },\n mounted: function mounted() {\n // 加载默认语言配置文件\n var localLang = window.localStorage.getItem('oms_lang');\n console.log(\"language from localStorage is %o\", localLang);\n\n if (localLang != null) {\n this.$i18n.locale = localLang;\n return;\n }\n\n var lang = navigator.language;\n console.log(\"language from system is %o\", lang);\n\n switch (lang) {\n case \"zh-HK\":\n case \"zh-TW\":\n case \"zh-SG\":\n case \"zh-CN\":\n this.$i18n.locale = \"cn\";\n break;\n\n default:\n this.$i18n.locale = \"en\";\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/Welcome.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.for-each */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_1__);\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Welcome\",\n data: function data() {\n return {\n // 应用注册表单是否可见\n appRegisterFormVisible: false,\n // 用户注册表单是否可见\n userRegisterFormVisible: false,\n // 应用注册表单对象\n appRegisterForm: {\n appName: \"\",\n password: \"\"\n },\n // 用户注册表单对象\n userRegisterForm: {\n username: \"\",\n phone: \"\",\n email: \"\"\n },\n // 控制台登陆对象\n appLoginForm: {\n appName: undefined,\n password: undefined\n },\n // 是否保持登录状态\n stayLogged: true\n };\n },\n methods: {\n // 请求应用下拉框数据\n queryAppNames: function queryAppNames(queryString, cb) {\n var array = [];\n var that = this;\n var url = \"/appInfo/list?condition=\" + queryString;\n this.axios.get(url).then(function (result) {\n result.forEach(function (appInfo) {\n array.push({\n \"value\": appInfo.appName\n });\n cb(array);\n });\n }, function (error) {\n return that.$message.error(error);\n });\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () {\n cb(array);\n }, 3000);\n },\n // 注册应用\n registerApp: function registerApp() {\n var _this = this;\n\n var that = this;\n this.axios.post(\"/appInfo/save\", this.appRegisterForm).then(function () {\n that.$message.success(_this.$t('message.success'));\n that.appRegisterFormVisible = false;\n }, that.appRegisterFormVisible = false);\n },\n // 注册用户(仅用于报警通知)\n registerUser: function registerUser() {\n var _this2 = this;\n\n var that = this;\n this.axios.post(\"/user/save\", this.userRegisterForm).then(function () {\n that.$message.success(_this2.$t('message.success'));\n that.userRegisterFormVisible = false;\n }, that.userRegisterFormVisible = false);\n },\n // 登陆控制台\n login: function login() {\n var _this3 = this;\n\n var that = this;\n this.axios.post(\"/appInfo/assert\", this.appLoginForm).then(function (res) {\n // 勾选了保持登录状态,就开启自动登录,直接本地存用户名密码(内部系统浏览器明文存问题不大)\n if (_this3.stayLogged) {\n window.localStorage.setItem('oms_auto_login', JSON.stringify(_this3.appLoginForm));\n }\n\n var appInfo = {\n id: res,\n appName: that.appLoginForm.appName\n }; // 将 appId 存储到 VueStore\n\n _this3.$store.commit(\"initAppInfo\", appInfo); // 跳转到主界面\n\n\n _this3.$router.push(\"/oms/home\");\n }, function (error) {\n window.localStorage.removeItem('oms_auto_login');\n that.$message.error(error);\n });\n },\n // 自动登录\n autoLogin: function autoLogin() {\n var autoLoginString = window.localStorage.getItem(\"oms_auto_login\");\n\n if (autoLoginString === undefined || autoLoginString === null) {\n return;\n }\n\n this.appLoginForm = JSON.parse(autoLoginString);\n this.login();\n }\n },\n mounted: function mounted() {\n // 加载默认语言配置文件\n var localLang = window.localStorage.getItem('oms_lang');\n console.log(\"language from localStorage is %o\", localLang);\n\n if (localLang != null) {\n this.$i18n.locale = localLang;\n } else {\n var lang = navigator.language;\n console.log(\"language from system is %o\", lang);\n\n switch (lang) {\n case \"zh-HK\":\n case \"zh-TW\":\n case \"zh-SG\":\n case \"zh-CN\":\n this.$i18n.locale = \"cn\";\n break;\n\n default:\n this.$i18n.locale = \"en\";\n }\n } // 自动登录\n\n\n this.autoLogin();\n }\n});\n\n//# sourceURL=webpack:///./src/components/Welcome.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -20,7 +20,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"container\" } }, [\n _c(\n \"div\",\n { attrs: { id: \"head\" } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { offset: 22 } },\n [\n _c(\n \"el-dropdown\",\n { on: { command: this.common.switchLanguage } },\n [\n _c(\"span\", { staticClass: \"el-dropdown-link\" }, [\n _c(\"p\", { staticStyle: { color: \"#ffffff\" } }, [\n _vm._v(\"Language\"),\n _c(\"i\", {\n staticClass: \"el-icon-arrow-down el-icon--right\"\n })\n ])\n ]),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\"el-dropdown-item\", { attrs: { command: \"en\" } }, [\n _vm._v(\"English\")\n ]),\n _c(\"el-dropdown-item\", { attrs: { command: \"cn\" } }, [\n _vm._v(\"简体中文\")\n ])\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"div\",\n { attrs: { id: \"welcome\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\", plain: \"\" },\n on: {\n click: function($event) {\n _vm.appRegisterFormVisible = true\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.appRegister\")))]\n ),\n _c(\n \"div\",\n { attrs: { id: \"entrance\" } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n id: \"appSelect\",\n filterable: \"\",\n remote: \"\",\n \"reserve-keyword\": \"\",\n placeholder: _vm.$t(\"message.appNameInputPLH\"),\n \"remote-method\": _vm.fetchAppNames,\n loading: _vm.loading\n },\n on: { change: _vm.selectedApp },\n model: {\n value: _vm.selectedAppInfo,\n callback: function($$v) {\n _vm.selectedAppInfo = $$v\n },\n expression: \"selectedAppInfo\"\n }\n },\n _vm._l(_vm.appInfoList, function(appInfo) {\n return _c(\"el-option\", {\n key: appInfo.id,\n attrs: { label: appInfo.appName, value: appInfo }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"success\", plain: \"\" },\n on: {\n click: function($event) {\n _vm.userRegisterFormVisible = true\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.userRegister\")))]\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: _vm.$t(\"message.appRegister\"),\n visible: _vm.appRegisterFormVisible,\n width: \"35%\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.appRegisterFormVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticStyle: { margin: \"0 5px\" },\n attrs: { model: _vm.appRegisterForm }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.appName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appRegisterForm.appName,\n callback: function($$v) {\n _vm.$set(_vm.appRegisterForm, \"appName\", $$v)\n },\n expression: \"appRegisterForm.appName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.appDescription\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appRegisterForm.description,\n callback: function($$v) {\n _vm.$set(_vm.appRegisterForm, \"description\", $$v)\n },\n expression: \"appRegisterForm.description\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.registerApp }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.register\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.appRegisterFormVisible = false\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.cancel\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: _vm.$t(\"message.userRegister\"),\n visible: _vm.userRegisterFormVisible,\n width: \"35%\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.userRegisterFormVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticStyle: { margin: \"0 5px\" },\n attrs: { model: _vm.userRegisterForm }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.name\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.userRegisterForm.username,\n callback: function($$v) {\n _vm.$set(_vm.userRegisterForm, \"username\", $$v)\n },\n expression: \"userRegisterForm.username\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.phone\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.userRegisterForm.phone,\n callback: function($$v) {\n _vm.$set(_vm.userRegisterForm, \"phone\", $$v)\n },\n expression: \"userRegisterForm.phone\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.email\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.userRegisterForm.email,\n callback: function($$v) {\n _vm.$set(_vm.userRegisterForm, \"email\", $$v)\n },\n expression: \"userRegisterForm.email\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.registerUser }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.register\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.userRegisterFormVisible = false\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.cancel\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/Welcome.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2241f1f4da-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"container\" } }, [\n _c(\n \"div\",\n { attrs: { id: \"head\" } },\n [\n _c(\n \"el-row\",\n { staticClass: \"row-bg\", attrs: { type: \"flex\", justify: \"end\" } },\n [\n _c(\n \"el-col\",\n { attrs: { span: \"2\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\", plain: \"\" },\n on: {\n click: function($event) {\n _vm.appRegisterFormVisible = true\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.appRegister\")))]\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: \"2\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"success\", plain: \"\" },\n on: {\n click: function($event) {\n _vm.userRegisterFormVisible = true\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.userRegister\")))]\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: \"2\" } },\n [\n _c(\n \"el-dropdown\",\n { on: { command: this.common.switchLanguage } },\n [\n _c(\"span\", { staticClass: \"el-dropdown-link\" }, [\n _c(\"p\", { staticStyle: { color: \"#ffffff\" } }, [\n _vm._v(\"Language\"),\n _c(\"i\", {\n staticClass: \"el-icon-arrow-down el-icon--right\"\n })\n ])\n ]),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\"el-dropdown-item\", { attrs: { command: \"en\" } }, [\n _vm._v(\"English\")\n ]),\n _c(\"el-dropdown-item\", { attrs: { command: \"cn\" } }, [\n _vm._v(\"简体中文\")\n ])\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"div\",\n { attrs: { id: \"welcome\" } },\n [\n _c(\"h1\", { attrs: { align: \"center\" } }, [\n _vm._v(_vm._s(_vm.$t(\"message.welcomeTitle\")))\n ]),\n _c(\n \"el-form\",\n {\n ref: \"ruleForm\",\n staticClass: \"loginWrap\",\n attrs: { model: _vm.appLoginForm, \"label-width\": \"0px\" }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { \"label-width\": \"\" } },\n [\n _c(\"el-autocomplete\", {\n staticClass: \"loginWrap\",\n attrs: {\n \"trigger-on-focus\": false,\n \"fetch-suggestions\": _vm.queryAppNames,\n placeholder: _vm.$t(\"message.appName\")\n },\n model: {\n value: _vm.appLoginForm.appName,\n callback: function($$v) {\n _vm.$set(_vm.appLoginForm, \"appName\", $$v)\n },\n expression: \"appLoginForm.appName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { \"label-width\": \"\" } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\"message.password\"),\n type: \"password\",\n \"show-password\": \"true\"\n },\n model: {\n value: _vm.appLoginForm.password,\n callback: function($$v) {\n _vm.$set(_vm.appLoginForm, \"password\", $$v)\n },\n expression: \"appLoginForm.password\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n {\n staticClass: \"loginWrap\",\n attrs: { type: \"primary\" },\n on: { click: _vm.login }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.login\")))]\n )\n ],\n 1\n ),\n _c(\n \"el-checkbox\",\n {\n staticStyle: { color: \"#f0f3f4\" },\n model: {\n value: _vm.stayLogged,\n callback: function($$v) {\n _vm.stayLogged = $$v\n },\n expression: \"stayLogged\"\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.stayLogged\")))]\n )\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: _vm.$t(\"message.appRegister\"),\n visible: _vm.appRegisterFormVisible,\n width: \"35%\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.appRegisterFormVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticStyle: { margin: \"0 5px\" },\n attrs: { model: _vm.appRegisterForm }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.appName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appRegisterForm.appName,\n callback: function($$v) {\n _vm.$set(_vm.appRegisterForm, \"appName\", $$v)\n },\n expression: \"appRegisterForm.appName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.appPassword\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appRegisterForm.password,\n callback: function($$v) {\n _vm.$set(_vm.appRegisterForm, \"password\", $$v)\n },\n expression: \"appRegisterForm.password\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.registerApp }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.register\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.appRegisterFormVisible = false\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.cancel\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: {\n title: _vm.$t(\"message.userRegister\"),\n visible: _vm.userRegisterFormVisible,\n width: \"35%\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.userRegisterFormVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticStyle: { margin: \"0 5px\" },\n attrs: { model: _vm.userRegisterForm }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.name\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.userRegisterForm.username,\n callback: function($$v) {\n _vm.$set(_vm.userRegisterForm, \"username\", $$v)\n },\n expression: \"userRegisterForm.username\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.phone\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.userRegisterForm.phone,\n callback: function($$v) {\n _vm.$set(_vm.userRegisterForm, \"phone\", $$v)\n },\n expression: \"userRegisterForm.phone\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.email\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.userRegisterForm.email,\n callback: function($$v) {\n _vm.$set(_vm.userRegisterForm, \"email\", $$v)\n },\n expression: \"userRegisterForm.email\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.registerUser }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.register\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.userRegisterFormVisible = false\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.cancel\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/Welcome.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2241f1f4da-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -31,7 +31,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/getUrl.js */ \"./node_modules/css-loader/dist/runtime/getUrl.js\");\nvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(/*! ../assets/banner.jpg */ \"./src/assets/banner.jpg\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\nexports.push([module.i, \"\\n#container[data-v-d4b7673c] {\\n width: 100%;\\n height: 100%;\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \");\\n}\\n#head[data-v-d4b7673c] {\\n width: 100%;\\n}\\n#welcome[data-v-d4b7673c] {\\n width: 100%;\\n height: 100%;\\n\\n /*\\n flex布局:\\n flex-direction:决定主轴的方向(项目的排列方向),比如row、column\\n flex-wrap:决定容器内项目是否可换行\\n justify-content:定义了项目在主轴的对齐方式(主轴在水平方向,就是水平居中)\\n align-items:定义了项目在交叉轴伤的对齐方式\\n */\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: center;\\n align-items: center;\\n}\\n.topBar[data-v-d4b7673c]{\\n position: fixed;\\n left: 30px;\\n top:10px;\\n color: #fff;\\n}\\n.right[data-v-d4b7673c]{\\n background-color: #ff9900;\\n color:#000;\\n display: inline-block;\\n box-sizing: border-box;\\n margin-left: 5px;\\n border-radius: 5px;\\n padding: 5px;\\n}\\n#entrance[data-v-d4b7673c] {\\n margin: 20px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/Welcome.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/getUrl.js */ \"./node_modules/css-loader/dist/runtime/getUrl.js\");\nvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(/*! ../assets/banner.jpg */ \"./src/assets/banner.jpg\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\nexports.push([module.i, \"\\n#container[data-v-d4b7673c] {\\n width: 100%;\\n height: 100%;\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \");\\n}\\n#head[data-v-d4b7673c] {\\n width: 100%;\\n}\\n#welcome[data-v-d4b7673c] {\\n width: 100%;\\n height: 100%;\\n\\n /*\\n flex布局:\\n flex-direction:决定主轴的方向(项目的排列方向),比如row、column\\n flex-wrap:决定容器内项目是否可换行\\n justify-content:定义了项目在主轴的对齐方式(主轴在水平方向,就是水平居中)\\n align-items:定义了项目在交叉轴伤的对齐方式\\n */\\n display: flex;\\n flex-direction: column;\\n /*flex-wrap: nowrap;*/\\n justify-content: center;\\n align-items: center;\\n}\\n.topBar[data-v-d4b7673c]{\\n position: fixed;\\n left: 30px;\\n top:10px;\\n color: #fff;\\n}\\n.right[data-v-d4b7673c]{\\n background-color: #ff9900;\\n color:#000;\\n display: inline-block;\\n box-sizing: border-box;\\n margin-left: 5px;\\n border-radius: 5px;\\n padding: 5px;\\n}\\nh1[data-v-d4b7673c] {\\n width: 450px;\\n color: #f0f3f4;\\n}\\n.loginWrap[data-v-d4b7673c] {\\n width: 300px;\\n}\\n\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/components/Welcome.vue?./node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/app.js b/powerjob-server/src/main/resources/static/js/app.js
index 8b0494cd..8432033e 100644
--- a/powerjob-server/src/main/resources/static/js/app.js
+++ b/powerjob-server/src/main/resources/static/js/app.js
@@ -256,7 +256,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bar
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Navbar\",\n data: function data() {\n return {};\n },\n methods: {\n // 退出当前应用\n onClickCloseConsole: function onClickCloseConsole() {\n this.$router.push(\"/\");\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/bar/Navbar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Navbar\",\n data: function data() {\n return {\n changeAppInfoDialogVisible: false,\n appInfo: {\n id: this.$store.state.appInfo.id,\n appName: this.$store.state.appInfo.appName,\n password: undefined,\n password2: undefined\n }\n };\n },\n methods: {\n // 退出当前应用\n onClickCloseConsole: function onClickCloseConsole() {\n window.localStorage.removeItem('oms_auto_login');\n this.$router.push(\"/\");\n },\n // 处理系统设置的指令时间\n handleSettings: function handleSettings(cmd) {\n switch (cmd) {\n case \"logout\":\n this.onClickCloseConsole();\n break;\n\n case \"changeAppInfo\":\n this.changeAppInfoDialogVisible = true;\n break;\n }\n },\n // 更新应用信息\n saveNewAppInfo: function saveNewAppInfo() {\n var _this = this;\n\n if (this.appInfo.password === this.appInfo.password2) {\n var that = this;\n this.axios.post(\"/appInfo/save\", this.appInfo).then(function () {\n that.$message.success(_this.$t('message.success'));\n that.$router.push(\"/\");\n }, function (e) {\n return that.$message.error(e);\n });\n }\n }\n }\n});\n\n//# sourceURL=webpack:///./src/components/bar/Navbar.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -304,7 +304,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"navbar\" } }, [\n _vm._m(0),\n _c(\n \"div\",\n { attrs: { id: \"right_content\" } },\n [\n _c(\n \"el-dropdown\",\n { on: { command: this.common.switchLanguage } },\n [\n _c(\"span\", { staticClass: \"el-dropdown-link\" }, [\n _c(\"p\", { staticStyle: { color: \"#ffffff\" } }, [\n _vm._v(\"Language\"),\n _c(\"i\", { staticClass: \"el-icon-arrow-down el-icon--right\" })\n ])\n ]),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\"el-dropdown-item\", { attrs: { command: \"en\" } }, [\n _vm._v(\"English\")\n ]),\n _c(\"el-dropdown-item\", { attrs: { command: \"cn\" } }, [\n _vm._v(\"简体中文\")\n ])\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"div\",\n [\n _c(\"el-button\", {\n attrs: { type: \"danger\", icon: \"el-icon-close\", circle: \"\" },\n on: { click: _vm.onClickCloseConsole }\n })\n ],\n 1\n )\n ],\n 1\n )\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"logo_content\" } }, [\n _c(\n \"a\",\n {\n attrs: {\n href: \"https://github.com/KFCFans/OhMyScheduler\",\n target: \"_blank\"\n }\n },\n [\n _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! ../../assets/powerjob-console-logo.png */ \"./src/assets/powerjob-console-logo.png\"),\n alt: \"logo\"\n }\n })\n ]\n )\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/bar/Navbar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2241f1f4da-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"navbar\" } }, [\n _vm._m(0),\n _c(\n \"div\",\n { attrs: { id: \"right_content\" } },\n [\n _c(\n \"el-dropdown\",\n { on: { command: this.common.switchLanguage } },\n [\n _c(\"span\", { staticClass: \"el-dropdown-link\" }, [\n _c(\"p\", { staticStyle: { color: \"#ffffff\" } }, [\n _vm._v(\"Language\"),\n _c(\"i\", { staticClass: \"el-icon-arrow-down el-icon--right\" })\n ])\n ]),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\"el-dropdown-item\", { attrs: { command: \"en\" } }, [\n _vm._v(\"English\")\n ]),\n _c(\"el-dropdown-item\", { attrs: { command: \"cn\" } }, [\n _vm._v(\"简体中文\")\n ])\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-dropdown\",\n { on: { command: _vm.handleSettings } },\n [\n _c(\"span\", { staticClass: \"el-dropdown-link\" }, [\n _c(\"p\", { staticStyle: { color: \"#ffffff\" } }, [\n _vm._v(\"Settings\"),\n _c(\"i\", { staticClass: \"el-icon-arrow-down el-icon--right\" })\n ])\n ]),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\n \"el-dropdown-item\",\n { attrs: { command: \"changeAppInfo\" } },\n [_vm._v(_vm._s(_vm.$t(\"message.changeAppInfo\")))]\n ),\n _c(\"el-dropdown-item\", { attrs: { command: \"logout\" } }, [\n _vm._v(_vm._s(_vm.$t(\"message.logout\")))\n ])\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.changeAppInfoDialogVisible, width: \"35%\" },\n on: {\n \"update:visible\": function($event) {\n _vm.changeAppInfoDialogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n {\n staticStyle: { margin: \"0 5px\" },\n attrs: { model: _vm.appInfo }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.appName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appInfo.appName,\n callback: function($$v) {\n _vm.$set(_vm.appInfo, \"appName\", $$v)\n },\n expression: \"appInfo.appName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.newPassword\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appInfo.password,\n callback: function($$v) {\n _vm.$set(_vm.appInfo, \"password\", $$v)\n },\n expression: \"appInfo.password\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.newPassword2\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.appInfo.password2,\n callback: function($$v) {\n _vm.$set(_vm.appInfo, \"password2\", $$v)\n },\n expression: \"appInfo.password2\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.saveNewAppInfo }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.save\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.changeAppInfoDialogVisible = false\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.cancel\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { attrs: { id: \"logo_content\" } }, [\n _c(\n \"a\",\n {\n attrs: {\n href: \"https://github.com/KFCFans/OhMyScheduler\",\n target: \"_blank\"\n }\n },\n [\n _c(\"img\", {\n attrs: {\n src: __webpack_require__(/*! ../../assets/powerjob-console-logo.png */ \"./src/assets/powerjob-console-logo.png\"),\n alt: \"logo\"\n }\n })\n ]\n )\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/bar/Navbar.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%2241f1f4da-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -676,7 +676,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! element-ui/lib/locale/lang/zh-CN */ \"./node_modules/element-ui/lib/locale/lang/zh-CN.js\");\n/* harmony import */ var element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nvar cn = Object(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n message: {\n // common\n 'save': '保存',\n 'cancel': '取消',\n 'refresh': '刷新',\n 'query': '查询',\n 'reset': '重置',\n 'keyword': '关键字',\n 'run': '运行',\n 'edit': '编辑',\n 'delete': '删除',\n 'success': '成功',\n 'failed': '失败',\n 'detail': '详情',\n 'download': '下载',\n 'stop': '停止',\n 'back': '返回',\n // 欢迎界面\n 'appRegister': '执行应用注册',\n 'userRegister': '报警用户录入',\n 'appNameInputPLH': '请输入应用名称',\n 'appName': '应用名称',\n 'appDescription': '应用描述',\n 'register': '注册',\n 'name': '姓名',\n 'phone': '手机号',\n 'email': '邮箱地址',\n // 左侧tab栏\n 'tabHome': '系统首页',\n 'tabJobManage': '任务管理',\n 'tabJobInstance': '任务实例',\n 'tabWorkflowManage': '工作流管理',\n 'tabWfInstance': '工作流实例',\n 'tabContainerOps': '容器',\n 'tabTemplate': '模版生成',\n 'tabContainerManager': '容器运维',\n // 系统首页\n 'omsServerTime': '调度服务器时间',\n 'localBrowserTime': '本地浏览器时间',\n 'githubURL': '项目地址',\n 'docURL': '文档地址',\n 'totalJobNum': '任务总数',\n 'runningInstanceNum': '当前运行实例数',\n 'recentFailedInstanceNum': '近期失败任务数',\n 'workerNum': '集群机器数',\n 'workerAddress': '机器地址',\n 'cpuLoad': 'CPU 占用',\n 'memoryLoad': '内存占用',\n 'diskLoad': '磁盘占用',\n // 任务管理\n 'jobId': '任务ID',\n 'instanceId': '任务实例ID',\n 'jobName': '任务名称',\n 'scheduleInfo': '定时信息',\n 'executeType': '执行类型',\n 'processorType': '处理器类型',\n 'status': '状态',\n 'operation': '操作',\n 'newJob': '新建任务',\n 'jobDescription': '任务描述',\n 'jobParams': '任务参数',\n 'timeExpressionType': '时间表达式类型',\n 'timeExpressionPlaceHolder': 'CRON填写CRON表达式,秒级任务填写整数,API无需填写',\n 'executeConfig': '执行配置',\n 'javaProcessorInfoPLH': '全限定类名,eg:com.github.kfcfans.DemoProcessor',\n 'containerProcessorInfoPLH': '容器ID#全限定类名,eg:1#com.github.kfcfans.DemoProcessor',\n 'shellProcessorInfoPLH': 'SHELL脚本文件内容',\n 'pythonProcessorInfoPLH': 'Python脚本文件内容',\n 'runtimeConfig': '运行时配置',\n 'maxInstanceNum': '最大实例数',\n 'threadConcurrency': '单机线程并发度',\n 'timeout': '运行时间限制(毫秒)',\n 'retryConfig': '重试配置',\n 'taskRetryTimes': 'Instance重试次数',\n 'subTaskRetryTimes': \"Task重试次数\",\n 'workerConfig': '机器配置',\n 'minCPU': '最低CPU核心数',\n 'minMemory': '最低内存(GB)',\n 'minDisk': '最低磁盘空间(GB)',\n 'clusterConfig': '集群配置',\n 'designatedWorkerAddress': '执行机器地址',\n 'designatedWorkerAddressPLH': '执行机器地址(可选,不指定代表全部;多值英文逗号分割)',\n 'maxWorkerNum': '最大执行机器数量',\n 'maxWorkerNumPLH': '最大执行机器数量(0代表不限)',\n 'alarmConfig': '报警配置',\n 'alarmSelectorPLH': '选择报警通知人员',\n 'standalone': '单机执行',\n 'broadcast': '广播执行',\n 'map': 'Map执行',\n 'mapReduce': 'MapReduce执行',\n 'fixRate': '固定频率(毫秒)',\n 'fixDelay': '固定延迟(毫秒)',\n 'workflow': '工作流',\n 'onlineCronTool': '在线生成工具',\n 'javaContainer': 'Java(容器)',\n // 任务实例管理\n 'wfInstanceId': '工作流实例ID',\n 'normalInstance': '普通任务实例',\n 'wfInstance': '工作流任务实例',\n 'triggerTime': '触发时间',\n 'finishedTime': '结束时间',\n 'log': '日志',\n 'runningTimes': '运行次数',\n 'taskTrackerAddress': 'TaskTracker 地址',\n 'startTime': '开始时间',\n 'result': '运行结果',\n 'subTaskInfo': '子任务数据',\n 'secondlyJobHistory': '最近10条秒级任务历史记录',\n 'subInstanceId': '子任务实例ID',\n // 工作流管理\n 'wfId': '工作流ID',\n 'wfName': '工作流名称',\n 'newWorkflow': '新建工作流',\n 'wfDescription': '工作流描述',\n 'importJob': '导入任务',\n 'deleteJob': '删除任务',\n 'newStartPoint': '新增起点',\n 'newEndPoint': '新增终点',\n 'deleteEdge': '删除边',\n 'importJobTitle': \"请选择需要导入工作流的任务\",\n 'wfTimeExpressionPLH': 'CRON填写CRON表达式,API无需填写',\n 'import': '导入',\n 'ntfClickNeedDeleteNode': '请点击需要删除的节点',\n 'ntfClickStartPoint': '请点击起始节点',\n 'ntfClickTargetPoint': '请点击目标节点',\n 'ntfClickDeleteEdge': '请点击需要删除的边',\n 'ntfAddStartPointFirst': '请先添加起点!',\n 'ntfInvalidEdge': '非法操作(起点终点相同)!',\n // 工作流实例\n 'wfTips': 'tips:点击节点可查看任务实例详情',\n 'ntfClickWaitingNode': '等待上游任务中...未生成任务实例,无法查看详情!',\n // 容器\n 'newContainer': '新增容器',\n 'containerType': '容器类型',\n 'containerGitURL': 'Git仓库地址',\n 'branchName': '分支名称',\n 'username': '用户名',\n 'password': '密码',\n 'containerId': '容器ID',\n 'containerName': '容器名称',\n 'containerVersion': '容器版本',\n 'deployTime': '部署时间',\n 'deploy': '部署',\n 'deployedWorkerList': '机器列表',\n 'uploadTips': '拖拽或点击文件后会自动上传',\n // 任务实例状态\n 'waitingDispatch': '等待派发',\n 'waitingWorkerReceive': '等待Worker接收',\n 'running': '运行中',\n 'stopped': '手动停止',\n 'wfWaiting': '等待调度',\n 'waitingUpstream': '等待上游节点'\n }\n}, element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1___default.a);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (cn);\n\n//# sourceURL=webpack:///./src/i18n/langs/cn.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! element-ui/lib/locale/lang/zh-CN */ \"./node_modules/element-ui/lib/locale/lang/zh-CN.js\");\n/* harmony import */ var element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nvar cn = Object(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n message: {\n // common\n 'save': '保存',\n 'cancel': '取消',\n 'refresh': '刷新',\n 'query': '查询',\n 'reset': '重置',\n 'keyword': '关键字',\n 'run': '运行',\n 'edit': '编辑',\n 'delete': '删除',\n 'success': '成功',\n 'failed': '失败',\n 'detail': '详情',\n 'download': '下载',\n 'stop': '停止',\n 'back': '返回',\n // 欢迎界面\n 'appRegister': '执行应用注册',\n 'userRegister': '报警用户录入',\n 'appNameInputPLH': '请输入应用名称',\n 'appName': '应用名称',\n 'appPassword': '密码',\n 'register': '注册',\n 'name': '姓名',\n 'phone': '手机号',\n 'email': '邮箱地址',\n 'welcomeTitle': '欢迎使用 PowerJob!',\n 'login': '登陆',\n 'logout': '退出',\n 'changeAppInfo': '修改应用信息',\n 'newPassword': '新密码',\n 'newPassword2': '确认密码',\n 'stayLogged': '保持登录状态',\n // 左侧tab栏\n 'tabHome': '系统首页',\n 'tabJobManage': '任务管理',\n 'tabJobInstance': '任务实例',\n 'tabWorkflowManage': '工作流管理',\n 'tabWfInstance': '工作流实例',\n 'tabContainerOps': '容器',\n 'tabTemplate': '模版生成',\n 'tabContainerManager': '容器运维',\n // 系统首页\n 'omsServerTime': '调度服务器时间',\n 'localBrowserTime': '本地浏览器时间',\n 'githubURL': '项目地址',\n 'docURL': '文档地址',\n 'totalJobNum': '任务总数',\n 'runningInstanceNum': '当前运行实例数',\n 'recentFailedInstanceNum': '近期失败任务数',\n 'workerNum': '集群机器数',\n 'workerAddress': '机器地址',\n 'cpuLoad': 'CPU 占用',\n 'memoryLoad': '内存占用',\n 'diskLoad': '磁盘占用',\n // 任务管理\n 'jobId': '任务ID',\n 'instanceId': '任务实例ID',\n 'jobName': '任务名称',\n 'scheduleInfo': '定时信息',\n 'executeType': '执行类型',\n 'processorType': '处理器类型',\n 'status': '状态',\n 'operation': '操作',\n 'newJob': '新建任务',\n 'jobDescription': '任务描述',\n 'jobParams': '任务参数',\n 'timeExpressionType': '时间表达式类型',\n 'timeExpressionPlaceHolder': 'CRON填写CRON表达式,秒级任务填写整数,API无需填写',\n 'executeConfig': '执行配置',\n 'javaProcessorInfoPLH': '全限定类名,eg:com.github.kfcfans.DemoProcessor',\n 'containerProcessorInfoPLH': '容器ID#全限定类名,eg:1#com.github.kfcfans.DemoProcessor',\n 'shellProcessorInfoPLH': 'SHELL脚本文件内容',\n 'pythonProcessorInfoPLH': 'Python脚本文件内容',\n 'runtimeConfig': '运行时配置',\n 'maxInstanceNum': '最大实例数',\n 'threadConcurrency': '单机线程并发度',\n 'timeout': '运行时间限制(毫秒)',\n 'retryConfig': '重试配置',\n 'taskRetryTimes': 'Instance重试次数',\n 'subTaskRetryTimes': \"Task重试次数\",\n 'workerConfig': '机器配置',\n 'minCPU': '最低CPU核心数',\n 'minMemory': '最低内存(GB)',\n 'minDisk': '最低磁盘空间(GB)',\n 'clusterConfig': '集群配置',\n 'designatedWorkerAddress': '执行机器地址',\n 'designatedWorkerAddressPLH': '执行机器地址(可选,不指定代表全部;多值英文逗号分割)',\n 'maxWorkerNum': '最大执行机器数量',\n 'maxWorkerNumPLH': '最大执行机器数量(0代表不限)',\n 'alarmConfig': '报警配置',\n 'alarmSelectorPLH': '选择报警通知人员',\n 'standalone': '单机执行',\n 'broadcast': '广播执行',\n 'map': 'Map执行',\n 'mapReduce': 'MapReduce执行',\n 'fixRate': '固定频率(毫秒)',\n 'fixDelay': '固定延迟(毫秒)',\n 'workflow': '工作流',\n 'onlineCronTool': '在线生成工具',\n 'javaContainer': 'Java(容器)',\n // 任务实例管理\n 'wfInstanceId': '工作流实例ID',\n 'normalInstance': '普通任务实例',\n 'wfInstance': '工作流任务实例',\n 'triggerTime': '触发时间',\n 'finishedTime': '结束时间',\n 'log': '日志',\n 'runningTimes': '运行次数',\n 'taskTrackerAddress': 'TaskTracker 地址',\n 'startTime': '开始时间',\n 'result': '运行结果',\n 'subTaskInfo': '子任务数据',\n 'secondlyJobHistory': '最近10条秒级任务历史记录',\n 'subInstanceId': '子任务实例ID',\n // 工作流管理\n 'wfId': '工作流ID',\n 'wfName': '工作流名称',\n 'newWorkflow': '新建工作流',\n 'wfDescription': '工作流描述',\n 'importJob': '导入任务',\n 'deleteJob': '删除任务',\n 'newStartPoint': '新增起点',\n 'newEndPoint': '新增终点',\n 'deleteEdge': '删除边',\n 'importJobTitle': \"请选择需要导入工作流的任务\",\n 'wfTimeExpressionPLH': 'CRON填写CRON表达式,API无需填写',\n 'import': '导入',\n 'ntfClickNeedDeleteNode': '请点击需要删除的节点',\n 'ntfClickStartPoint': '请点击起始节点',\n 'ntfClickTargetPoint': '请点击目标节点',\n 'ntfClickDeleteEdge': '请点击需要删除的边',\n 'ntfAddStartPointFirst': '请先添加起点!',\n 'ntfInvalidEdge': '非法操作(起点终点相同)!',\n // 工作流实例\n 'wfTips': 'tips:点击节点可查看任务实例详情',\n 'ntfClickWaitingNode': '等待上游任务中...未生成任务实例,无法查看详情!',\n // 容器\n 'newContainer': '新增容器',\n 'containerType': '容器类型',\n 'containerGitURL': 'Git仓库地址',\n 'branchName': '分支名称',\n 'username': '用户名',\n 'password': '密码',\n 'containerId': '容器ID',\n 'containerName': '容器名称',\n 'containerVersion': '容器版本',\n 'deployTime': '部署时间',\n 'deploy': '部署',\n 'deployedWorkerList': '机器列表',\n 'uploadTips': '拖拽或点击文件后会自动上传',\n // 任务实例状态\n 'waitingDispatch': '等待派发',\n 'waitingWorkerReceive': '等待Worker接收',\n 'running': '运行中',\n 'stopped': '手动停止',\n 'wfWaiting': '等待调度',\n 'waitingUpstream': '等待上游节点'\n }\n}, element_ui_lib_locale_lang_zh_CN__WEBPACK_IMPORTED_MODULE_1___default.a);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (cn);\n\n//# sourceURL=webpack:///./src/i18n/langs/cn.js?");
/***/ }),
@@ -688,7 +688,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Use
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! element-ui/lib/locale/lang/en */ \"./node_modules/element-ui/lib/locale/lang/en.js\");\n/* harmony import */ var element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nvar en = Object(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n message: {\n 'save': 'save',\n 'cancel': 'cancel',\n 'refresh': 'refresh',\n 'query': 'query',\n 'reset': 'reset',\n 'keyword': 'keyword',\n 'run': 'run',\n 'edit': 'edit',\n 'delete': 'delete',\n 'success': 'success',\n 'failed': 'failed',\n 'detail': 'detail',\n 'download': 'download',\n 'stop': 'stop',\n 'back': 'back',\n // 欢迎界面\n 'appRegister': 'Application Registration',\n 'userRegister': 'User Registration',\n 'appNameInputPLH': 'Enter The AppName',\n 'appName': 'AppName',\n 'appDescription': 'AppDescription',\n 'register': 'register',\n 'name': 'name',\n 'phone': 'phone',\n 'email': 'email',\n 'tabHome': 'Home',\n 'tabJobManage': 'JobManage',\n 'tabJobInstance': 'JobInstance',\n 'tabWorkflowManage': 'WorkflowManage',\n 'tabWfInstance': 'WorkflowInstance',\n 'tabContainerOps': 'ContainerOps',\n 'tabTemplate': 'TemplateGenerator',\n 'tabContainerManager': 'ContainerManager',\n 'omsServerTime': 'server time',\n 'localBrowserTime': 'local browser time',\n 'githubURL': 'GitHub Repo',\n 'docURL': 'document address',\n 'totalJobNum': 'total job Num',\n 'runningInstanceNum': 'running instance num',\n 'recentFailedInstanceNum': 'recent failed instance Num',\n 'workerNum': 'worker cluster size',\n 'workerAddress': 'worker address',\n 'cpuLoad': 'CPU Load',\n 'memoryLoad': 'Memory Load',\n 'diskLoad': 'Disk Load',\n // JobManage\n 'jobId': 'JobID',\n 'instanceId': 'InstanceID',\n 'jobName': 'JobName',\n 'scheduleInfo': 'ScheduleInfo',\n 'executeType': 'ExecuteType',\n 'processorType': 'ProcessorType',\n 'status': 'status',\n 'operation': 'operation',\n 'newJob': 'New Job',\n 'jobDescription': 'JobDescription',\n 'jobParams': 'JobParams',\n 'timeExpressionType': 'TimeExpressionType',\n 'timeExpressionPlaceHolder': 'cron expression or number(millions) for fix_rate/fix_delay job',\n 'executeConfig': 'ExecuteConfig',\n 'javaProcessorInfoPLH': 'classname, eg: com.github.kfcfans.DemoProcessor',\n 'containerProcessorInfoPLH': 'containerID#classname, eg: 1#com.github.kfcfans.DemoProcessor',\n 'shellProcessorInfoPLH': 'shell script',\n 'pythonProcessorInfoPLH': 'python script',\n 'runtimeConfig': 'RuntimeConfig',\n 'maxInstanceNum': 'MaxInstanceNum',\n 'threadConcurrency': 'ThreadConcurrency',\n 'timeout': 'TimeLimit (ms)',\n 'retryConfig': 'RetryConfig',\n 'taskRetryTimes': 'InstanceRetryTimes',\n 'subTaskRetryTimes': \"TaskRetryTimes\",\n 'workerConfig': 'WorkerConfig',\n 'minCPU': 'MinAvailableCPUCores',\n 'minMemory': 'MinMemory(GB)',\n 'minDisk': 'MinDisk(GB)',\n 'clusterConfig': 'ClusterConfig',\n 'designatedWorkerAddress': 'DesignatedWorkerAddress',\n 'designatedWorkerAddressPLH': 'empty for all worker or IP:Port,IP:Port ...',\n 'maxWorkerNum': 'MaxWorkerNum',\n 'maxWorkerNumPLH': '0 means no limit',\n 'alarmConfig': 'AlarmConfig',\n 'alarmSelectorPLH': 'select alarm recipient ',\n 'standalone': 'Standalone',\n 'broadcast': 'Broadcast',\n 'map': 'MAP',\n 'mapReduce': 'MapReduce',\n 'fixRate': 'Fix Rate (ms)',\n 'fixDelay': 'Fix Delay (ms)',\n 'workflow': 'workflow',\n 'onlineCronTool': 'online cron tool',\n 'javaContainer': 'Java(Container)',\n // JobInstance\n 'wfInstanceId': 'WorkflowInstanceId',\n 'normalInstance': 'normal instance',\n 'wfInstance': 'workflow instance',\n 'triggerTime': 'trigger time',\n 'finishedTime': 'finished time',\n 'log': 'log',\n 'runningTimes': 'running times',\n 'taskTrackerAddress': 'taskTracker address',\n 'startTime': 'start time',\n 'result': 'result',\n 'subTaskInfo': 'subTask info',\n 'secondlyJobHistory': 'secondlyJobHistory',\n 'subInstanceId': 'subInstanceId',\n // workflowManage\n 'wfId': 'WorkflowID',\n 'wfName': 'WorkflowName',\n 'newWorkflow': 'new workflow',\n 'wfDescription': 'description',\n 'importJob': 'import job',\n 'deleteJob': 'delete job',\n 'newStartPoint': 'new starting point',\n 'newEndPoint': 'new ending point',\n 'deleteEdge': 'delete edge',\n 'importJobTitle': \"select jobs\",\n 'wfTimeExpressionPLH': 'cron expression for CRON or empty for API',\n 'import': 'import',\n 'ntfClickNeedDeleteNode': 'Please click on the node you want to delete.',\n 'ntfClickStartPoint': 'Please click on the start node',\n 'ntfClickTargetPoint': 'Please click on the end node',\n 'ntfClickDeleteEdge': 'Please click on the edge you want to remove.',\n 'ntfAddStartPointFirst': 'Please add the starting point first!',\n 'ntfInvalidEdge': 'Illegal operation (same origin and destination)!',\n // workflowInstance\n 'wfTips': 'tips:Click on a node to view details of the job instance',\n 'ntfClickWaitingNode': 'Waiting for the upstream instances... No instances have been generated, and details cannot be viewed!',\n // 容器\n 'newContainer': 'new container',\n 'containerType': 'type',\n 'containerGitURL': 'Git URL',\n 'branchName': 'branch',\n 'username': 'username',\n 'password': 'password',\n 'containerId': 'ID',\n 'containerName': 'name',\n 'containerVersion': 'version',\n 'deployTime': 'deployed time',\n 'deploy': 'deploy',\n 'deployedWorkerList': 'worker list',\n 'uploadTips': 'Drag and drop or click on the file to upload it automatically',\n // 任务实例状态\n 'waitingDispatch': 'waiting dispatch',\n 'waitingWorkerReceive': 'waiting receive',\n 'running': 'running',\n 'stopped': 'stopped',\n 'wfWaiting': 'waiting',\n 'waitingUpstream': 'waiting upstream'\n }\n}, element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1___default.a);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (en);\n\n//# sourceURL=webpack:///./src/i18n/langs/en.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! element-ui/lib/locale/lang/en */ \"./node_modules/element-ui/lib/locale/lang/en.js\");\n/* harmony import */ var element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nvar en = Object(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n message: {\n 'save': 'save',\n 'cancel': 'cancel',\n 'refresh': 'refresh',\n 'query': 'query',\n 'reset': 'reset',\n 'keyword': 'keyword',\n 'run': 'run',\n 'edit': 'edit',\n 'delete': 'delete',\n 'success': 'success',\n 'failed': 'failed',\n 'detail': 'detail',\n 'download': 'download',\n 'stop': 'stop',\n 'back': 'back',\n // 欢迎界面\n 'appRegister': 'App Registration',\n 'userRegister': 'User Registration',\n 'appNameInputPLH': 'Enter The AppName',\n 'appName': 'AppName',\n 'appPassword': 'AppPassword',\n 'register': 'register',\n 'name': 'name',\n 'phone': 'phone',\n 'email': 'email',\n 'welcomeTitle': 'Welcome to use PowerJob!',\n 'login': 'Login',\n 'logout': 'Logout',\n 'changeAppInfo': 'Change AppInfo',\n 'newPassword': 'New Password',\n 'newPassword2': 'Check New Password',\n 'stayLogged': 'Keep me logged in',\n 'tabHome': 'Home',\n 'tabJobManage': 'JobManage',\n 'tabJobInstance': 'JobInstance',\n 'tabWorkflowManage': 'WorkflowManage',\n 'tabWfInstance': 'WorkflowInstance',\n 'tabContainerOps': 'ContainerOps',\n 'tabTemplate': 'TemplateGenerator',\n 'tabContainerManager': 'ContainerManager',\n 'omsServerTime': 'server time',\n 'localBrowserTime': 'local browser time',\n 'githubURL': 'GitHub Repo',\n 'docURL': 'document address',\n 'totalJobNum': 'total job Num',\n 'runningInstanceNum': 'running instance num',\n 'recentFailedInstanceNum': 'recent failed instance Num',\n 'workerNum': 'worker cluster size',\n 'workerAddress': 'worker address',\n 'cpuLoad': 'CPU Load',\n 'memoryLoad': 'Memory Load',\n 'diskLoad': 'Disk Load',\n // JobManage\n 'jobId': 'JobID',\n 'instanceId': 'InstanceID',\n 'jobName': 'JobName',\n 'scheduleInfo': 'ScheduleInfo',\n 'executeType': 'ExecuteType',\n 'processorType': 'ProcessorType',\n 'status': 'status',\n 'operation': 'operation',\n 'newJob': 'New Job',\n 'jobDescription': 'JobDescription',\n 'jobParams': 'JobParams',\n 'timeExpressionType': 'TimeExpressionType',\n 'timeExpressionPlaceHolder': 'cron expression or number(millions) for fix_rate/fix_delay job',\n 'executeConfig': 'ExecuteConfig',\n 'javaProcessorInfoPLH': 'classname, eg: com.github.kfcfans.DemoProcessor',\n 'containerProcessorInfoPLH': 'containerID#classname, eg: 1#com.github.kfcfans.DemoProcessor',\n 'shellProcessorInfoPLH': 'shell script',\n 'pythonProcessorInfoPLH': 'python script',\n 'runtimeConfig': 'RuntimeConfig',\n 'maxInstanceNum': 'MaxInstanceNum',\n 'threadConcurrency': 'ThreadConcurrency',\n 'timeout': 'TimeLimit (ms)',\n 'retryConfig': 'RetryConfig',\n 'taskRetryTimes': 'InstanceRetryTimes',\n 'subTaskRetryTimes': \"TaskRetryTimes\",\n 'workerConfig': 'WorkerConfig',\n 'minCPU': 'MinAvailableCPUCores',\n 'minMemory': 'MinMemory(GB)',\n 'minDisk': 'MinDisk(GB)',\n 'clusterConfig': 'ClusterConfig',\n 'designatedWorkerAddress': 'DesignatedWorkerAddress',\n 'designatedWorkerAddressPLH': 'empty for all worker or IP:Port,IP:Port ...',\n 'maxWorkerNum': 'MaxWorkerNum',\n 'maxWorkerNumPLH': '0 means no limit',\n 'alarmConfig': 'AlarmConfig',\n 'alarmSelectorPLH': 'select alarm recipient ',\n 'standalone': 'Standalone',\n 'broadcast': 'Broadcast',\n 'map': 'MAP',\n 'mapReduce': 'MapReduce',\n 'fixRate': 'Fix Rate (ms)',\n 'fixDelay': 'Fix Delay (ms)',\n 'workflow': 'workflow',\n 'onlineCronTool': 'online cron tool',\n 'javaContainer': 'Java(Container)',\n // JobInstance\n 'wfInstanceId': 'WorkflowInstanceId',\n 'normalInstance': 'normal instance',\n 'wfInstance': 'workflow instance',\n 'triggerTime': 'trigger time',\n 'finishedTime': 'finished time',\n 'log': 'log',\n 'runningTimes': 'running times',\n 'taskTrackerAddress': 'taskTracker address',\n 'startTime': 'start time',\n 'result': 'result',\n 'subTaskInfo': 'subTask info',\n 'secondlyJobHistory': 'secondlyJobHistory',\n 'subInstanceId': 'subInstanceId',\n // workflowManage\n 'wfId': 'WorkflowID',\n 'wfName': 'WorkflowName',\n 'newWorkflow': 'new workflow',\n 'wfDescription': 'description',\n 'importJob': 'import job',\n 'deleteJob': 'delete job',\n 'newStartPoint': 'new starting point',\n 'newEndPoint': 'new ending point',\n 'deleteEdge': 'delete edge',\n 'importJobTitle': \"select jobs\",\n 'wfTimeExpressionPLH': 'cron expression for CRON or empty for API',\n 'import': 'import',\n 'ntfClickNeedDeleteNode': 'Please click on the node you want to delete.',\n 'ntfClickStartPoint': 'Please click on the start node',\n 'ntfClickTargetPoint': 'Please click on the end node',\n 'ntfClickDeleteEdge': 'Please click on the edge you want to remove.',\n 'ntfAddStartPointFirst': 'Please add the starting point first!',\n 'ntfInvalidEdge': 'Illegal operation (same origin and destination)!',\n // workflowInstance\n 'wfTips': 'tips:Click on a node to view details of the job instance',\n 'ntfClickWaitingNode': 'Waiting for the upstream instances... No instances have been generated, and details cannot be viewed!',\n // 容器\n 'newContainer': 'new container',\n 'containerType': 'type',\n 'containerGitURL': 'Git URL',\n 'branchName': 'branch',\n 'username': 'username',\n 'password': 'password',\n 'containerId': 'ID',\n 'containerName': 'name',\n 'containerVersion': 'version',\n 'deployTime': 'deployed time',\n 'deploy': 'deploy',\n 'deployedWorkerList': 'worker list',\n 'uploadTips': 'Drag and drop or click on the file to upload it automatically',\n // 任务实例状态\n 'waitingDispatch': 'waiting dispatch',\n 'waitingWorkerReceive': 'waiting receive',\n 'running': 'running',\n 'stopped': 'stopped',\n 'wfWaiting': 'waiting',\n 'waitingUpstream': 'waiting upstream'\n }\n}, element_ui_lib_locale_lang_en__WEBPACK_IMPORTED_MODULE_1___default.a);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (en);\n\n//# sourceURL=webpack:///./src/i18n/langs/en.js?");
/***/ }),
@@ -712,7 +712,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _en_
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.to-string */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.regexp.exec */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_string_search__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.string.search */ \"./node_modules/core-js/modules/es.string.search.js\");\n/* harmony import */ var core_js_modules_es_string_search__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_search__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.promise.js */ \"./node_modules/core-js/modules/es.promise.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.object.assign.js */ \"./node_modules/core-js/modules/es.object.assign.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.promise.finally.js */ \"./node_modules/core-js/modules/es.promise.finally.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var _App_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./App.vue */ \"./src/App.vue\");\n/* harmony import */ var element_ui__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! element-ui */ \"./node_modules/element-ui/lib/element-ui.common.js\");\n/* harmony import */ var element_ui__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(element_ui__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./styles.scss */ \"./src/styles.scss\");\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_styles_scss__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _plugins_element_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./plugins/element.js */ \"./src/plugins/element.js\");\n/* harmony import */ var _i18n_i18n__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./i18n/i18n */ \"./src/i18n/i18n.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var flyio__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! flyio */ \"./node_modules/flyio/index.js\");\n/* harmony import */ var flyio__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(flyio__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./router */ \"./src/router.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./store */ \"./src/store.js\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./common */ \"./src/common.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // axios 负责统一拦截处理 ResultDTO,fly 负责处理不需要拦截的请求\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].use(element_ui__WEBPACK_IMPORTED_MODULE_10___default.a); // let baseURL = \"http://139.224.83.134:7700\";\n\nvar baseURL = \"/\";\nvar timeout = 5000;\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].prototype.common = _common__WEBPACK_IMPORTED_MODULE_18__[\"default\"];\n/* ******* axios config ******* */\n\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].prototype.axios = axios__WEBPACK_IMPORTED_MODULE_14___default.a;\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.defaults.baseURL = baseURL;\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.defaults.timeout = timeout;\n/* ******* fly.io config ******* */\n\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].prototype.flyio = flyio__WEBPACK_IMPORTED_MODULE_15___default.a;\nflyio__WEBPACK_IMPORTED_MODULE_15___default.a.config.baseURL = baseURL;\nflyio__WEBPACK_IMPORTED_MODULE_15___default.a.config.timeout = timeout;\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].config.productionTip = false;\nnew vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]({\n router: _router__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n store: _store__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n i18n: _i18n_i18n__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n render: function render(h) {\n return h(_App_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]);\n }\n}).$mount('#app'); //请求发送拦截,没有 appId 要求重新 \"登录\"\n\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.interceptors.request.use(function (request) {\n var url = request.url;\n var isListAppInfo = url.search(\"/appInfo/list\") !== -1;\n var isAppRegister = url.search(\"/appInfo/save\") !== -1;\n var isUserRegister = url.search(\"/user/save\") !== -1;\n\n if (isListAppInfo || isAppRegister || isUserRegister) {\n return request;\n }\n\n var appId = _store__WEBPACK_IMPORTED_MODULE_17__[\"default\"].state.appInfo.id;\n\n if (appId === undefined || appId === null) {\n _router__WEBPACK_IMPORTED_MODULE_16__[\"default\"].push(\"/\");\n return Promise.reject(\"no appId\");\n }\n\n return request;\n}, function (error) {\n // Do something with request error\n return Promise.reject(error);\n}); // 请求返回拦截,封装公共处理逻辑\n\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.interceptors.response.use(function (response) {\n if (response.data.success === true) {\n return response.data.data;\n }\n\n element_ui__WEBPACK_IMPORTED_MODULE_10__[\"Message\"].warning(\"ERROR:\" + response.data.message);\n return Promise.reject(response.data.msg);\n}, function (error) {\n element_ui__WEBPACK_IMPORTED_MODULE_10__[\"Message\"].error(error.toString());\n return Promise.reject(error);\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (baseURL);\n\n//# sourceURL=webpack:///./src/main.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.to-string */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.regexp.exec */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_string_search__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.string.search */ \"./node_modules/core-js/modules/es.string.search.js\");\n/* harmony import */ var core_js_modules_es_string_search__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_search__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.promise.js */ \"./node_modules/core-js/modules/es.promise.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.object.assign.js */ \"./node_modules/core-js/modules/es.object.assign.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node_modules/core-js/modules/es.promise.finally.js */ \"./node_modules/core-js/modules/es.promise.finally.js\");\n/* harmony import */ var _Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Users_tjq_Desktop_DistributeCompute_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var _App_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./App.vue */ \"./src/App.vue\");\n/* harmony import */ var element_ui__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! element-ui */ \"./node_modules/element-ui/lib/element-ui.common.js\");\n/* harmony import */ var element_ui__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(element_ui__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./styles.scss */ \"./src/styles.scss\");\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_styles_scss__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _plugins_element_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./plugins/element.js */ \"./src/plugins/element.js\");\n/* harmony import */ var _i18n_i18n__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./i18n/i18n */ \"./src/i18n/i18n.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! axios */ \"./node_modules/axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var flyio__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! flyio */ \"./node_modules/flyio/index.js\");\n/* harmony import */ var flyio__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(flyio__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./router */ \"./src/router.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./store */ \"./src/store.js\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./common */ \"./src/common.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // axios 负责统一拦截处理 ResultDTO,fly 负责处理不需要拦截的请求\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].use(element_ui__WEBPACK_IMPORTED_MODULE_10___default.a); // let baseURL = \"http://139.224.83.134:7700\";\n\nvar baseURL = \"/\";\nvar timeout = 5000;\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].prototype.common = _common__WEBPACK_IMPORTED_MODULE_18__[\"default\"];\n/* ******* axios config ******* */\n\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].prototype.axios = axios__WEBPACK_IMPORTED_MODULE_14___default.a;\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.defaults.baseURL = baseURL;\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.defaults.timeout = timeout;\n/* ******* fly.io config ******* */\n\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].prototype.flyio = flyio__WEBPACK_IMPORTED_MODULE_15___default.a;\nflyio__WEBPACK_IMPORTED_MODULE_15___default.a.config.baseURL = baseURL;\nflyio__WEBPACK_IMPORTED_MODULE_15___default.a.config.timeout = timeout;\nvue__WEBPACK_IMPORTED_MODULE_8__[\"default\"].config.productionTip = false;\nnew vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]({\n router: _router__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n store: _store__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n i18n: _i18n_i18n__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n render: function render(h) {\n return h(_App_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"]);\n }\n}).$mount('#app'); //请求发送拦截,没有 appId 要求重新 \"登录\"\n\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.interceptors.request.use(function (request) {\n var url = request.url;\n var isListAppInfo = url.search(\"/appInfo/list\") !== -1;\n var isAppRegister = url.search(\"/appInfo/save\") !== -1;\n var isUserRegister = url.search(\"/user/save\") !== -1;\n var isAssertAppInfo = url.search(\"/appInfo/assert\") !== -1;\n\n if (isListAppInfo || isAppRegister || isUserRegister || isAssertAppInfo) {\n return request;\n }\n\n var appId = _store__WEBPACK_IMPORTED_MODULE_17__[\"default\"].state.appInfo.id;\n\n if (appId === undefined || appId === null) {\n _router__WEBPACK_IMPORTED_MODULE_16__[\"default\"].push(\"/\");\n return Promise.reject(\"no appId\");\n }\n\n return request;\n}, function (error) {\n // Do something with request error\n return Promise.reject(error);\n}); // 请求返回拦截,封装公共处理逻辑\n\naxios__WEBPACK_IMPORTED_MODULE_14___default.a.interceptors.response.use(function (response) {\n if (response.data.success === true) {\n return response.data.data;\n }\n\n element_ui__WEBPACK_IMPORTED_MODULE_10__[\"Message\"].warning(\"ERROR:\" + response.data.message);\n return Promise.reject(response.data.msg);\n}, function (error) {\n element_ui__WEBPACK_IMPORTED_MODULE_10__[\"Message\"].error(error.toString());\n return Promise.reject(error);\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (baseURL);\n\n//# sourceURL=webpack:///./src/main.js?");
/***/ }),
diff --git a/powerjob-worker-agent/pom.xml b/powerjob-worker-agent/pom.xml
index cdc8df20..89629745 100644
--- a/powerjob-worker-agent/pom.xml
+++ b/powerjob-worker-agent/pom.xml
@@ -10,12 +10,12 @@
4.0.0
powerjob-worker-agent
- 3.0.1
+ 3.1.0
jar
- 3.0.1
+ 3.1.0
1.2.3
4.3.2
diff --git a/powerjob-worker-samples/pom.xml b/powerjob-worker-samples/pom.xml
index 700cd387..cb063bd8 100644
--- a/powerjob-worker-samples/pom.xml
+++ b/powerjob-worker-samples/pom.xml
@@ -10,11 +10,11 @@
4.0.0
powerjob-worker-samples
- 3.0.1
+ 3.1.0
2.2.6.RELEASE
- 3.0.1
+ 3.1.0
1.2.68
diff --git a/powerjob-worker/pom.xml b/powerjob-worker/pom.xml
index 5c8ab6af..a46e28b2 100644
--- a/powerjob-worker/pom.xml
+++ b/powerjob-worker/pom.xml
@@ -10,16 +10,18 @@
4.0.0
powerjob-worker
- 3.0.1
+ 3.1.0
jar
5.2.4.RELEASE
- 3.0.1
+ 3.1.0
1.4.200
3.4.2
5.6.1
5.0.0-RC5
+
+ 1.2.3
@@ -66,6 +68,13 @@
test
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+ test
+
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/actors/TaskTrackerActor.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/actors/TaskTrackerActor.java
index 0c742cba..cbb69d8d 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/actors/TaskTrackerActor.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/actors/TaskTrackerActor.java
@@ -127,6 +127,7 @@ public class TaskTrackerActor extends AbstractActor {
* ProcessorTracker 心跳处理器
*/
private void onReceiveProcessorTrackerStatusReportReq(ProcessorTrackerStatusReportReq req) {
+
TaskTracker taskTracker = TaskTrackerPool.getTaskTrackerPool(req.getInstanceId());
if (taskTracker == null) {
log.warn("[TaskTrackerActor] receive ProcessorTrackerStatusReportReq({}) but system can't find TaskTracker.", req);
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/background/ServerDiscoveryService.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/background/ServerDiscoveryService.java
index d17c7982..5fb104fa 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/background/ServerDiscoveryService.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/background/ServerDiscoveryService.java
@@ -48,7 +48,9 @@ public class ServerDiscoveryService {
String ip = currentServer.split(":")[0];
// 直接请求当前Server的HTTP服务,可以少一次网络开销,减轻Server负担
String firstServerAddress = IP2ADDRESS.get(ip);
- result = acquire(firstServerAddress);
+ if (firstServerAddress != null) {
+ result = acquire(firstServerAddress);
+ }
}
for (String httpServerAddress : OhMyWorker.getConfig().getServerAddress()) {
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OhMyConfig.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OhMyConfig.java
index 8c60f627..f3a45cc3 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OhMyConfig.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OhMyConfig.java
@@ -3,8 +3,10 @@ package com.github.kfcfans.powerjob.worker.common;
import com.github.kfcfans.powerjob.common.RemoteConstant;
import com.github.kfcfans.powerjob.worker.common.constants.StoreStrategy;
import com.github.kfcfans.powerjob.worker.core.processor.ProcessResult;
+import com.google.common.collect.Lists;
import lombok.Data;
+import java.util.Collections;
import java.util.List;
/**
@@ -26,7 +28,7 @@ public class OhMyConfig {
/**
* 调度服务器地址,ip:port 或 域名
*/
- private List serverAddress;
+ private List serverAddress = Lists.newArrayList();
/**
* 本地持久化方式,默认使用磁盘
*/
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/container/OmsContainerFactory.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/container/OmsContainerFactory.java
index 17cd16f5..cb804165 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/container/OmsContainerFactory.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/container/OmsContainerFactory.java
@@ -5,7 +5,7 @@ import akka.pattern.Patterns;
import com.github.kfcfans.powerjob.common.RemoteConstant;
import com.github.kfcfans.powerjob.common.model.DeployedContainerInfo;
import com.github.kfcfans.powerjob.common.request.ServerDeployContainerRequest;
-import com.github.kfcfans.powerjob.common.request.http.WorkerNeedDeployContainerRequest;
+import com.github.kfcfans.powerjob.common.request.WorkerNeedDeployContainerRequest;
import com.github.kfcfans.powerjob.common.response.AskResponse;
import com.github.kfcfans.powerjob.worker.OhMyWorker;
import com.github.kfcfans.powerjob.worker.common.utils.AkkaUtils;
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/processor/ProcessorTracker.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/processor/ProcessorTracker.java
index d0df40bf..cc85bf8a 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/processor/ProcessorTracker.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/processor/ProcessorTracker.java
@@ -54,6 +54,8 @@ public class ProcessorTracker {
private OmsLogger omsLogger;
// ProcessResult 上报失败的重试队列
private Queue statusReportRetryQueue;
+ // 上一次空闲时间
+ private long lastIdleTime;
private String taskTrackerAddress;
private ActorSelection taskTrackerActorRef;
@@ -62,6 +64,8 @@ public class ProcessorTracker {
private ScheduledExecutorService timingPool;
private static final int THREAD_POOL_QUEUE_MAX_SIZE = 100;
+ // 长时间空闲的 ProcessorTracker 会发起销毁请求
+ private static final long MAX_IDLE_TIME = 120000;
// 当 ProcessorTracker 出现根本性错误(比如 Processor 创建失败,所有的任务直接失败)
private boolean lethal = false;
@@ -82,6 +86,7 @@ public class ProcessorTracker {
this.omsLogger = new OmsServerLogger(instanceId);
this.statusReportRetryQueue = Queues.newLinkedBlockingQueue();
+ this.lastIdleTime = -1L;
// 初始化 线程池,TimingPool 启动的任务会检查 ThreadPool,所以必须先初始化线程池,否则NPE
initThreadPool();
@@ -221,6 +226,7 @@ public class ProcessorTracker {
@Override
public void run() {
+ // 超时检查,如果超时则自动关闭 TaskTracker
long interval = System.currentTimeMillis() - startTime;
// 秒级任务的ProcessorTracker不应该关闭
if (!TimeExpressionType.frequentTypes.contains(instanceInfo.getTimeExpressionType())) {
@@ -231,6 +237,25 @@ public class ProcessorTracker {
}
}
+ // 判断线程池活跃状态,长时间空闲则上报 TaskTracker 请求检查
+ if (threadPool.getActiveCount() > 0) {
+ lastIdleTime = -1;
+ }else {
+ if (lastIdleTime == -1) {
+ lastIdleTime = System.currentTimeMillis();
+ }else {
+ long idleTime = System.currentTimeMillis() - lastIdleTime;
+ if (idleTime > MAX_IDLE_TIME) {
+ log.warn("[ProcessorTracker-{}] ProcessorTracker have been idle for {}ms, it's time to tell TaskTracker and then destroy self.", instanceId, idleTime);
+
+ // 不可靠通知,如果该请求失败,则整个任务处理集群缺失一个 ProcessorTracker,影响可接受
+ taskTrackerActorRef.tell(ProcessorTrackerStatusReportReq.buildIdleReport(instanceId), null);
+ destroy();
+ return;
+ }
+ }
+ }
+
// 上报状态之前,先重新发送失败的任务,只要有结果堆积,就不上报状态(让 PT 认为该 TT 失联然后重试相关任务)
while (!statusReportRetryQueue.isEmpty()) {
ProcessorReportTaskStatusReq req = statusReportRetryQueue.poll();
@@ -245,8 +270,7 @@ public class ProcessorTracker {
// 上报当前 ProcessorTracker 负载
long waitingNum = threadPool.getQueue().size();
- ProcessorTrackerStatusReportReq req = new ProcessorTrackerStatusReportReq(instanceId, waitingNum);
- taskTrackerActorRef.tell(req, null);
+ taskTrackerActorRef.tell(ProcessorTrackerStatusReportReq.buildLoadReport(instanceId, waitingNum), null);
log.debug("[ProcessorTracker-{}] send heartbeat to TaskTracker, current waiting task num is {}.", instanceId, waitingNum);
}
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/CommonTaskTracker.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/CommonTaskTracker.java
index 848bd9e4..78b20322 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/CommonTaskTracker.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/CommonTaskTracker.java
@@ -2,15 +2,12 @@ package com.github.kfcfans.powerjob.worker.core.tracker.task;
import akka.actor.ActorSelection;
import akka.pattern.Patterns;
-import com.github.kfcfans.powerjob.common.ExecuteType;
-import com.github.kfcfans.powerjob.common.InstanceStatus;
-import com.github.kfcfans.powerjob.common.SystemInstanceResult;
+import com.github.kfcfans.powerjob.common.*;
import com.github.kfcfans.powerjob.common.model.InstanceDetail;
import com.github.kfcfans.powerjob.common.request.ServerScheduleJobReq;
import com.github.kfcfans.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
import com.github.kfcfans.powerjob.common.response.AskResponse;
import com.github.kfcfans.powerjob.worker.OhMyWorker;
-import com.github.kfcfans.powerjob.common.RemoteConstant;
import com.github.kfcfans.powerjob.worker.common.constants.TaskConstant;
import com.github.kfcfans.powerjob.worker.common.constants.TaskStatus;
import com.github.kfcfans.powerjob.worker.common.utils.AkkaUtils;
@@ -105,10 +102,11 @@ public class CommonTaskTracker extends TaskTracker {
rootTask.setLastReportTime(-1L);
rootTask.setSubInstanceId(instanceId);
- if (!taskPersistenceService.save(rootTask)) {
- log.error("[TaskTracker-{}] create root task failed.", instanceId);
- }else {
+ if (taskPersistenceService.save(rootTask)) {
log.info("[TaskTracker-{}] create root task successfully.", instanceId);
+ }else {
+ log.error("[TaskTracker-{}] create root task failed.", instanceId);
+ throw new OmsException("create root task failed for instance: " + instanceId);
}
}
@@ -176,7 +174,7 @@ public class CommonTaskTracker extends TaskTracker {
success = holder.failedNum == 0;
result = String.format("total:%d,succeed:%d,failed:%d", holder.getTotalTaskNum(), holder.succeedNum, holder.failedNum);
break;
- // MapReduce 和 Broadcast 任务实例是否完成根据**Last_Task**的执行情况判断
+ // MapReduce 和 Broadcast 任务实例是否完成根据**LastTask**的执行情况判断
default:
Optional lastTaskOptional = taskPersistenceService.getLastTask(instanceId, instanceId);
@@ -267,8 +265,8 @@ public class CommonTaskTracker extends TaskTracker {
taskPersistenceService.updateTask(instanceId, uncheckTask.getTaskId(), updateEntity);
- log.warn("[TaskTracker-{}] task(taskId={}) try to dispatch again due to unreceived the response from ProcessorTracker.",
- instanceId, uncheckTask.getTaskId());
+ log.warn("[TaskTracker-{}] task(id={},name={}) try to dispatch again due to unreceived the response from ProcessorTracker.",
+ instanceId, uncheckTask.getTaskId(), uncheckTask.getTaskName());
}
});
@@ -280,9 +278,6 @@ public class CommonTaskTracker extends TaskTracker {
log.warn("[TaskTracker-{}] some ProcessorTracker disconnected from TaskTracker,their address is {}.", instanceId, disconnectedPTs);
taskPersistenceService.updateLostTasks(disconnectedPTs);
}
-
- // 6.3 超时检查 -> 检查超时的Task
-
}
@Override
@@ -290,7 +285,7 @@ public class CommonTaskTracker extends TaskTracker {
try {
innerRun();
}catch (Exception e) {
- log.warn("[TaskTracker-{}] status checker execute failed, please fix the bug (@tjq)!", instanceInfo.getInstanceId(), e);
+ log.warn("[TaskTracker-{}] status checker execute failed, please fix the bug (@tjq)!", instanceId, e);
}
}
}
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/TaskTracker.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/TaskTracker.java
index cfb8b907..3b6a3537 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/TaskTracker.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/core/tracker/task/TaskTracker.java
@@ -267,8 +267,20 @@ public abstract class TaskTracker {
* @param heartbeatReq ProcessorTracker(任务的执行管理器)发来的心跳包,包含了其当前状态
*/
public void receiveProcessorTrackerHeartbeat(ProcessorTrackerStatusReportReq heartbeatReq) {
- ptStatusHolder.updateStatus(heartbeatReq);
log.debug("[TaskTracker-{}] receive heartbeat: {}", instanceId, heartbeatReq);
+ ptStatusHolder.updateStatus(heartbeatReq);
+
+ // 上报空闲,检查是否已经接收到全部该 ProcessorTracker 负责的任务
+ if (heartbeatReq.getType() == ProcessorTrackerStatusReportReq.IDLE) {
+ String idlePtAddress = heartbeatReq.getAddress();
+ // 该 ProcessorTracker 已销毁,重置为初始状态
+ ptStatusHolder.getProcessorTrackerStatus(idlePtAddress).setDispatched(false);
+ List unfinishedTask = TaskPersistenceService.INSTANCE.getAllUnFinishedTaskByAddress(instanceId, idlePtAddress);
+ if (!CollectionUtils.isEmpty(unfinishedTask)) {
+ log.warn("[TaskTracker-{}] ProcessorTracker({}) is idle now but have unfinished tasks: {}", instanceId, idlePtAddress, unfinishedTask);
+ unfinishedTask.forEach(task -> updateTaskStatus(task.getTaskId(), TaskStatus.WORKER_PROCESS_FAILED.getValue(), System.currentTimeMillis(), "SYSTEM: unreceived process result"));
+ }
+ }
}
/**
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java
index 0a26f996..a941c34f 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java
@@ -33,7 +33,8 @@ public class ConnectionFactory {
synchronized (ConnectionFactory.class) {
if (dataSource == null) {
- StoreStrategy strategy = OhMyWorker.getConfig().getStoreStrategy();
+ // 兼容单元测试,否则没办法单独测试 DAO 层了
+ StoreStrategy strategy = OhMyWorker.getConfig() == null ? StoreStrategy.DISK : OhMyWorker.getConfig().getStoreStrategy();
HikariConfig config = new HikariConfig();
config.setDriverClassName("org.h2.Driver");
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskDO.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskDO.java
index 840b7088..ef5041d6 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskDO.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskDO.java
@@ -66,9 +66,8 @@ public class TaskDO {
@Override
public String toString() {
- return "TaskDO{" +
+ return "{" +
"taskId='" + taskId + '\'' +
- ", instanceId='" + instanceId + '\'' +
", taskName='" + taskName + '\'' +
", address='" + address + '\'' +
", status=" + status +
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskPersistenceService.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskPersistenceService.java
index 7788adeb..0180b9ca 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskPersistenceService.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/TaskPersistenceService.java
@@ -156,6 +156,23 @@ public class TaskPersistenceService {
return Lists.newArrayList();
}
+ // 获取某个 ProcessorTracker 未完成的任务
+ public List getAllUnFinishedTaskByAddress(Long instanceId, String address) {
+ try {
+ String condition = String.format("status not in (%d, %d)", TaskStatus.WORKER_PROCESS_SUCCESS.getValue(), TaskStatus.WORKER_PROCESS_FAILED.getValue());
+
+ SimpleTaskQuery query = new SimpleTaskQuery();
+ query.setInstanceId(instanceId);
+ query.setAddress(address);
+ query.setQueryCondition(condition);
+
+ return execute(() -> taskDAO.simpleQuery(query));
+ }catch (Exception e) {
+ log.error("[TaskPersistenceService] getAllTaskByAddress for instance(id={}) failed.", instanceId, e);
+ }
+ return Lists.newArrayList();
+ }
+
/**
* 获取指定状态的Task
*/
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/pojo/request/ProcessorTrackerStatusReportReq.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/pojo/request/ProcessorTrackerStatusReportReq.java
index 8a924958..37941078 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/pojo/request/ProcessorTrackerStatusReportReq.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/pojo/request/ProcessorTrackerStatusReportReq.java
@@ -16,6 +16,12 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class ProcessorTrackerStatusReportReq implements OmsSerializable {
+ public static final int IDLE = 1;
+ public static final int LOAD = 2;
+
+ // IDLE 代表 ProcessorTracker 长期处于空闲状态,LOAD 代表 负载上报请求
+ private int type;
+
private Long instanceId;
/**
@@ -33,11 +39,24 @@ public class ProcessorTrackerStatusReportReq implements OmsSerializable {
*/
private String address;
- public ProcessorTrackerStatusReportReq(Long instanceId, long remainTaskNum) {
- this.instanceId = instanceId;
- this.remainTaskNum = remainTaskNum;
- this.time = System.currentTimeMillis();
- this.address = OhMyWorker.getWorkerAddress();
+ public static ProcessorTrackerStatusReportReq buildIdleReport(Long instanceId) {
+ ProcessorTrackerStatusReportReq req = new ProcessorTrackerStatusReportReq();
+ req.type = IDLE;
+ req.instanceId = instanceId;
+ req.time = System.currentTimeMillis();
+ req.address = OhMyWorker.getWorkerAddress();
+ req.setRemainTaskNum(0);
+ return req;
+ }
+
+ public static ProcessorTrackerStatusReportReq buildLoadReport(Long instanceId, Long remainTaskNum) {
+ ProcessorTrackerStatusReportReq req = new ProcessorTrackerStatusReportReq();
+ req.type = LOAD;
+ req.instanceId = instanceId;
+ req.time = System.currentTimeMillis();
+ req.address = OhMyWorker.getWorkerAddress();
+ req.setRemainTaskNum(remainTaskNum);
+ return req;
}
}
diff --git a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/CommonTest.java b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/CommonTest.java
new file mode 100644
index 00000000..ba884113
--- /dev/null
+++ b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/CommonTest.java
@@ -0,0 +1,78 @@
+package com.github.kfcfans.powerjob;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import com.github.kfcfans.powerjob.common.ExecuteType;
+import com.github.kfcfans.powerjob.common.ProcessorType;
+import com.github.kfcfans.powerjob.common.RemoteConstant;
+import com.github.kfcfans.powerjob.common.utils.NetUtils;
+import com.github.kfcfans.powerjob.worker.OhMyWorker;
+import com.github.kfcfans.powerjob.worker.common.OhMyConfig;
+import com.github.kfcfans.powerjob.worker.common.utils.AkkaUtils;
+import com.github.kfcfans.powerjob.worker.pojo.model.InstanceInfo;
+import com.github.kfcfans.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
+import com.typesafe.config.ConfigFactory;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+
+/**
+ * 启动公共服务
+ *
+ * @author tjq
+ * @since 2020/6/17
+ */
+public class CommonTest {
+
+ protected static ActorSelection remoteProcessorTracker;
+ protected static ActorSelection remoteTaskTracker;
+
+ @BeforeAll
+ public static void startWorker() throws Exception {
+ OhMyConfig ohMyConfig = new OhMyConfig();
+ ohMyConfig.setAppName("oms-test");
+ ohMyConfig.setEnableTestMode(true);
+
+ OhMyWorker worker = new OhMyWorker();
+ worker.setConfig(ohMyConfig);
+ worker.init();
+
+ ActorSystem testAS = ActorSystem.create("oms-test", ConfigFactory.load("oms-akka-test.conf"));
+ String address = NetUtils.getLocalHost() + ":27777";
+
+ remoteProcessorTracker = testAS.actorSelection(AkkaUtils.getAkkaWorkerPath(address, RemoteConstant.PROCESSOR_TRACKER_ACTOR_NAME));
+ remoteTaskTracker = testAS.actorSelection(AkkaUtils.getAkkaWorkerPath(address, RemoteConstant.Task_TRACKER_ACTOR_NAME));
+ }
+
+ @AfterAll
+ public static void stop() throws Exception {
+ Thread.sleep(120000);
+ }
+
+ public static TaskTrackerStartTaskReq genTaskTrackerStartTaskReq(String processor) {
+
+ InstanceInfo instanceInfo = new InstanceInfo();
+
+ instanceInfo.setJobId(1L);
+ instanceInfo.setInstanceId(10086L);
+
+ instanceInfo.setExecuteType(ExecuteType.STANDALONE.name());
+ instanceInfo.setProcessorType(ProcessorType.EMBEDDED_JAVA.name());
+ instanceInfo.setProcessorInfo(processor);
+
+ instanceInfo.setInstanceTimeoutMS(500000);
+
+ instanceInfo.setThreadConcurrency(5);
+ instanceInfo.setTaskRetryNum(3);
+
+ TaskTrackerStartTaskReq req = new TaskTrackerStartTaskReq();
+
+ req.setTaskTrackerAddress(NetUtils.getLocalHost() + ":27777");
+ req.setInstanceInfo(instanceInfo);
+
+ req.setTaskId("0");
+ req.setTaskName("ROOT_TASK");
+ req.setTaskCurrentRetryNums(0);
+
+ return req;
+ }
+}
diff --git a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/PersistenceServiceTest.java b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/PersistenceServiceTest.java
index a35aeddf..8f0482fb 100644
--- a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/PersistenceServiceTest.java
+++ b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/PersistenceServiceTest.java
@@ -24,6 +24,7 @@ public class PersistenceServiceTest {
public static void initTable() throws Exception {
taskPersistenceService.init();
+ System.out.println("=============== init data ===============");
List taskList = Lists.newLinkedList();
for (int i = 0; i < 10; i++) {
TaskDO task = new TaskDO();
@@ -39,10 +40,11 @@ public class PersistenceServiceTest {
task.setAddress(NetUtils.getLocalHost());
task.setLastModifiedTime(System.currentTimeMillis());
task.setCreatedTime(System.currentTimeMillis());
+ task.setLastReportTime(System.currentTimeMillis());
+ task.setResult("");
}
taskPersistenceService.batchSave(taskList);
- System.out.println("=============== init data ===============");
taskList.forEach(System.out::println);
}
@@ -75,4 +77,11 @@ public class PersistenceServiceTest {
System.out.println("updateLostTasks: " + success);
}
+ @Test
+ public void testGetAllUnFinishedTaskByAddress() throws Exception {
+ System.out.println("=============== testGetAllUnFinishedTaskByAddress ===============");
+ List res = taskPersistenceService.getAllUnFinishedTaskByAddress(10086L, NetUtils.getLocalHost());
+ System.out.println(res);
+ }
+
}
diff --git a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/ProcessorTrackerTest.java b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/ProcessorTrackerTest.java
index 5d57643d..8c3d6a1d 100644
--- a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/ProcessorTrackerTest.java
+++ b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/ProcessorTrackerTest.java
@@ -9,6 +9,7 @@ import com.github.kfcfans.powerjob.worker.common.OhMyConfig;
import com.github.kfcfans.powerjob.common.RemoteConstant;
import com.github.kfcfans.powerjob.worker.common.utils.AkkaUtils;
import com.github.kfcfans.powerjob.common.utils.NetUtils;
+import com.github.kfcfans.powerjob.worker.core.tracker.processor.ProcessorTracker;
import com.github.kfcfans.powerjob.worker.pojo.model.InstanceInfo;
import com.github.kfcfans.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
import com.typesafe.config.ConfigFactory;
@@ -23,68 +24,20 @@ import org.junit.jupiter.api.Test;
* @author tjq
* @since 2020/3/24
*/
-public class ProcessorTrackerTest {
-
- private static ActorSelection remoteProcessorTracker;
-
- @BeforeAll
- public static void startWorker() throws Exception {
- OhMyConfig ohMyConfig = new OhMyConfig();
- ohMyConfig.setAppName("oms-test");
- OhMyWorker worker = new OhMyWorker();
- worker.setConfig(ohMyConfig);
- worker.init();
-
- ActorSystem testAS = ActorSystem.create("oms-test", ConfigFactory.load("oms-akka-test.conf"));
- String akkaRemotePath = AkkaUtils.getAkkaWorkerPath(NetUtils.getLocalHost(), RemoteConstant.PROCESSOR_TRACKER_ACTOR_NAME);
- remoteProcessorTracker = testAS.actorSelection(akkaRemotePath);
- }
-
- @AfterAll
- public static void stop() throws Exception {
- Thread.sleep(120000);
- }
+public class ProcessorTrackerTest extends CommonTest {
@Test
public void testBasicProcessor() throws Exception {
- TaskTrackerStartTaskReq req = genTaskTrackerStartTaskReq("com.github.kfcfans.oms.processors.TestBasicProcessor");
+ TaskTrackerStartTaskReq req = genTaskTrackerStartTaskReq("com.github.kfcfans.powerjob.processors.TestBasicProcessor");
remoteProcessorTracker.tell(req, null);
Thread.sleep(30000);
}
@Test
public void testMapReduceProcessor() throws Exception {
- TaskTrackerStartTaskReq req = genTaskTrackerStartTaskReq("com.github.kfcfans.oms.processors.TestMapReduceProcessor");
+ TaskTrackerStartTaskReq req = genTaskTrackerStartTaskReq("com.github.kfcfans.powerjob.processors.TestMapReduceProcessor");
remoteProcessorTracker.tell(req, null);
Thread.sleep(30000);
}
-
- private static TaskTrackerStartTaskReq genTaskTrackerStartTaskReq(String processor) {
-
- InstanceInfo instanceInfo = new InstanceInfo();
-
- instanceInfo.setJobId(1L);
- instanceInfo.setInstanceId(10086L);
-
- instanceInfo.setExecuteType(ExecuteType.STANDALONE.name());
- instanceInfo.setProcessorType(ProcessorType.EMBEDDED_JAVA.name());
- instanceInfo.setProcessorInfo(processor);
-
- instanceInfo.setInstanceTimeoutMS(500000);
-
- instanceInfo.setThreadConcurrency(5);
- instanceInfo.setTaskRetryNum(3);
-
- TaskTrackerStartTaskReq req = new TaskTrackerStartTaskReq();
-
- req.setTaskTrackerAddress(NetUtils.getLocalHost());
- req.setInstanceInfo(instanceInfo);
-
- req.setTaskId("0");
- req.setTaskName("ROOT_TASK");
- req.setTaskCurrentRetryNums(0);
-
- return req;
- }
}
diff --git a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/TestUtils.java b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/TestUtils.java
index 427edd4f..c55ce57f 100644
--- a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/TestUtils.java
+++ b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/TestUtils.java
@@ -19,6 +19,7 @@ public class TestUtils {
public static ServerScheduleJobReq genServerScheduleJobReq(ExecuteType executeType, TimeExpressionType timeExpressionType) {
ServerScheduleJobReq req = new ServerScheduleJobReq();
+ req.setJobId(1L);
req.setInstanceId(10086L);
req.setAllWorkerAddress(Lists.newArrayList(NetUtils.getLocalHost() + ":" + RemoteConstant.DEFAULT_WORKER_PORT));
@@ -38,15 +39,15 @@ public class TestUtils {
switch (executeType) {
case STANDALONE:
req.setExecuteType(ExecuteType.STANDALONE.name());
- req.setProcessorInfo("com.github.kfcfans.oms.processors.TestBasicProcessor");
+ req.setProcessorInfo("com.github.kfcfans.powerjob.processors.TestBasicProcessor");
break;
case MAP_REDUCE:
req.setExecuteType(ExecuteType.MAP_REDUCE.name());
- req.setProcessorInfo("com.github.kfcfans.oms.processors.TestMapReduceProcessor");
+ req.setProcessorInfo("com.github.kfcfans.powerjob.processors.TestMapReduceProcessor");
break;
case BROADCAST:
req.setExecuteType(ExecuteType.BROADCAST.name());
- req.setProcessorInfo("com.github.kfcfans.oms.processors.TestBroadcastProcessor");
+ req.setProcessorInfo("com.github.kfcfans.powerjob.processors.TestBroadcastProcessor");
break;
}
diff --git a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/function/IdleTest.java b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/function/IdleTest.java
new file mode 100644
index 00000000..0a09a4df
--- /dev/null
+++ b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/function/IdleTest.java
@@ -0,0 +1,40 @@
+package com.github.kfcfans.powerjob.function;
+
+import com.github.kfcfans.powerjob.CommonTest;
+import com.github.kfcfans.powerjob.TestUtils;
+import com.github.kfcfans.powerjob.common.ExecuteType;
+import com.github.kfcfans.powerjob.common.TimeExpressionType;
+import com.github.kfcfans.powerjob.common.request.ServerScheduleJobReq;
+import com.github.kfcfans.powerjob.worker.core.tracker.processor.ProcessorTracker;
+import com.github.kfcfans.powerjob.worker.core.tracker.task.TaskTracker;
+import com.github.kfcfans.powerjob.worker.pojo.request.ProcessorTrackerStatusReportReq;
+import com.github.kfcfans.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
+import org.junit.jupiter.api.Test;
+
+/**
+ * 空闲测试
+ *
+ * @author tjq
+ * @since 2020/6/17
+ */
+public class IdleTest extends CommonTest {
+
+ @Test
+ public void testProcessorTrackerSendIdleReport() throws Exception {
+ TaskTrackerStartTaskReq req = genTaskTrackerStartTaskReq("com.github.kfcfans.powerjob.processors.TestBasicProcessor");
+ ProcessorTracker pt = new ProcessorTracker(req);
+ Thread.sleep(300000);
+ }
+
+ @Test
+ public void testTaskTrackerProcessorIdle() throws Exception {
+
+ ProcessorTrackerStatusReportReq req = ProcessorTrackerStatusReportReq.buildIdleReport(10086L);
+ ServerScheduleJobReq serverScheduleJobReq = TestUtils.genServerScheduleJobReq(ExecuteType.STANDALONE, TimeExpressionType.API);
+
+ TaskTracker taskTracker = TaskTracker.create(serverScheduleJobReq);
+ if (taskTracker != null) {
+ taskTracker.receiveProcessorTrackerHeartbeat(req);
+ }
+ }
+}
diff --git a/powerjob-worker/src/test/resources/oms-akka-test.conf b/powerjob-worker/src/test/resources/oms-akka-test.conf
index 7615d41a..ec3f1ee2 100644
--- a/powerjob-worker/src/test/resources/oms-akka-test.conf
+++ b/powerjob-worker/src/test/resources/oms-akka-test.conf
@@ -5,7 +5,7 @@ akka {
allow-java-serialization = off
serialization-bindings {
- "OmsSerializable" = jackson-cbor
+ "com.github.kfcfans.powerjob.common.OmsSerializable" = jackson-cbor
}
}
remote {