diff --git a/pom.xml b/pom.xml
index 24f4c25b..2a3fc49d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,10 +6,10 @@
com.github.kfcfans
powerjob
- 1.0.0
+ 2.0.0
pom
powerjob
- https://github.com/KFCFans/PowerJob
+ http://www.powerjob.tech
Distributed scheduling and execution framework
diff --git a/powerjob-client/pom.xml b/powerjob-client/pom.xml
index 2d4286da..d464c9d4 100644
--- a/powerjob-client/pom.xml
+++ b/powerjob-client/pom.xml
@@ -5,16 +5,16 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-client
- 3.2.1
+ 3.2.2
jar
- 3.2.1
+ 3.2.2
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 1b0d66d7..5a573cbb 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
@@ -228,6 +228,22 @@ public class OhMyClient {
return JsonUtils.parseObject(post, ResultDTO.class);
}
+ /**
+ * 重试任务实例
+ * 只有完成状态(成功、失败、手动停止、被取消)的任务才能被重试,且暂不支持工作流内任务实例的重试
+ * @param instanceId 任务实例ID
+ * @return true 代表取消成功,false 取消失败
+ * @throws Exception 异常
+ */
+ public ResultDTO retryInstance(Long instanceId) throws Exception {
+ RequestBody body = new FormBody.Builder()
+ .add("instanceId", instanceId.toString())
+ .add("appId", appId.toString())
+ .build();
+ String post = postHA(OpenAPIConstant.RETRY_INSTANCE, body);
+ return JsonUtils.parseObject(post, ResultDTO.class);
+ }
+
/**
* 查询任务实例状态
* @param instanceId 应用实例ID
@@ -410,6 +426,6 @@ public class OhMyClient {
}
log.error("[OhMyClient] do post for path: {} failed because of no server available in {}.", path, allAddress);
- throw new OmsException("no server available");
+ throw new OmsException("no server available when send post");
}
}
diff --git a/powerjob-client/src/test/java/TestClient.java b/powerjob-client/src/test/java/TestClient.java
index b4d00ae8..5cebd7ac 100644
--- a/powerjob-client/src/test/java/TestClient.java
+++ b/powerjob-client/src/test/java/TestClient.java
@@ -109,4 +109,10 @@ public class TestClient {
ResultDTO cancelRes = ohMyClient.cancelInstance(startRes.getData());
System.out.println("cancelJob result: " + JsonUtils.toJSONString(cancelRes));
}
+
+ @Test
+ public void testRetryInstance() throws Exception {
+ ResultDTO res = ohMyClient.retryInstance(169557545206153344L);
+ System.out.println(res);
+ }
}
diff --git a/powerjob-common/pom.xml b/powerjob-common/pom.xml
index bca0ae69..9aa123c9 100644
--- a/powerjob-common/pom.xml
+++ b/powerjob-common/pom.xml
@@ -5,12 +5,12 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-common
- 3.2.1
+ 3.2.2
jar
diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/OpenAPIConstant.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/OpenAPIConstant.java
index 82477591..2f4868ef 100644
--- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/OpenAPIConstant.java
+++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/OpenAPIConstant.java
@@ -23,6 +23,7 @@ public class OpenAPIConstant {
/* ************* Instance 区 ************* */
public static final String STOP_INSTANCE = "/stopInstance";
public static final String CANCEL_INSTANCE = "/cancelInstance";
+ public static final String RETRY_INSTANCE = "/retryInstance";
public static final String FETCH_INSTANCE_STATUS = "/fetchInstanceStatus";
public static final String FETCH_INSTANCE_INFO = "/fetchInstanceInfo";
diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java
index 9e36fb94..1d5945ec 100644
--- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java
+++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java
@@ -14,7 +14,7 @@ public class SystemMetrics implements OmsSerializable, Comparable
// CPU核心数量
private int cpuProcessors;
- // CPU负载(需要处以核心数)
+ // CPU负载(负载 和 使用率 是两个完全不同的概念,Java 无法获取 CPU 使用率,只能获取负载)
private double cpuLoad;
// 内存(单位 GB)
@@ -34,11 +34,12 @@ public class SystemMetrics implements OmsSerializable, Comparable
@Override
public int compareTo(SystemMetrics that) {
- return this.calculateScore() - that.calculateScore();
+ // 降序排列
+ return that.calculateScore() - this.calculateScore();
}
/**
- * 计算得分情况,内存 then CPU then 磁盘(磁盘必须有1G以上的剩余空间)
+ * 计算得分情况,内存 & CPU (磁盘不参与计算)
* @return 得分情况
*/
public int calculateScore() {
@@ -47,13 +48,17 @@ public class SystemMetrics implements OmsSerializable, Comparable
return score;
}
- double availableCPUCores = cpuProcessors * cpuLoad;
- double availableMemory = jvmMaxMemory - jvmUsedMemory;
+ // 对于 TaskTracker 来说,内存是任务顺利完成的关键,因此内存 2 块钱 1GB
+ double memScore = (jvmMaxMemory - jvmUsedMemory) * 2;
+ // CPU 剩余负载,1 块钱 1 斤
+ double cpuScore = cpuProcessors - cpuLoad;
+ // Indian Windows 无法获取 CpuLoad,为 -1,固定为 1
+ if (cpuScore > cpuProcessors) {
+ cpuScore = 1;
+ }
- // Windows下无法获取CPU可用核心数,值固定为-1
- cpuLoad = Math.max(0, cpuLoad);
-
- return (int) (availableMemory * 2 + availableCPUCores);
+ score = (int) (memScore + cpuScore);
+ return score;
}
/**
@@ -65,9 +70,17 @@ public class SystemMetrics implements OmsSerializable, Comparable
*/
public boolean available(double minCPUCores, double minMemorySpace, double minDiskSpace) {
- double currentCpuCores = Math.max(cpuLoad * cpuProcessors, 0);
- double currentMemory = jvmMaxMemory - jvmUsedMemory;
- double currentDisk = diskTotal - diskUsed;
- return currentCpuCores >= minCPUCores && currentMemory >= minMemorySpace && currentDisk >= minDiskSpace;
+ double availableMemory = jvmMaxMemory - jvmUsedMemory;
+ double availableDisk = diskTotal - diskUsed;
+
+ if (availableMemory < minMemorySpace || availableDisk < minDiskSpace) {
+ return false;
+ }
+
+ // cpuLoad 为负数代表无法获取,不判断。等于 0 为最理想情况,CPU 空载,不需要判断
+ if (cpuLoad <= 0 || minCPUCores <= 0) {
+ return true;
+ }
+ return minCPUCores < (cpuProcessors - cpuLoad);
}
}
diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java
index 4627ee53..08da3c00 100644
--- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java
+++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java
@@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.util.Collection;
+import java.util.UUID;
import java.util.function.Supplier;
@@ -146,4 +147,12 @@ public class CommonUtils {
return OmsConstant.NONE;
}
+ /**
+ * 生成 UUID
+ * @return uuid
+ */
+ public static String genUUID() {
+ return StringUtils.replace(UUID.randomUUID().toString(), "-", "");
+ }
+
}
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index dc745cf1..835d725b 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -5,20 +5,26 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-server
- 3.2.1
+ 3.2.2
jar
2.9.2
2.2.6.RELEASE
- 3.2.1
+ 3.2.2
+
8.0.19
+ 19.7.0.0
+ 7.4.1.jre8
+ 11.5.0.0
+ 42.2.14
1.4.200
+
2.5.2
5.7.0.202003110725-r
3.0.1
@@ -44,6 +50,30 @@
mysql-connector-java
${mysql.version}
+
+
+ com.oracle.database.jdbc
+ ojdbc8
+ ${ojdbc.version}
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ ${mssql-jdbc.version}
+
+
+
+ com.ibm.db2
+ jcc
+ ${db2-jdbc.version}
+
+
+
+ org.postgresql
+ postgresql
+ ${postgresql.version}
+
com.h2database
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java
index 686a4c60..434a2e9b 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java
@@ -1,15 +1,11 @@
package com.github.kfcfans.powerjob.server;
import com.github.kfcfans.powerjob.server.akka.OhMyServer;
-import com.github.kfcfans.powerjob.server.common.utils.OmsFileUtils;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
-import java.io.File;
-
/**
* SpringBoot 启动入口
*
@@ -47,13 +43,6 @@ public class OhMyApplication {
private static void pre() {
log.info(TIPS);
-
- // 删除历史遗留的 H2 数据库文件
- try {
- FileUtils.forceDeleteOnExit(new File(OmsFileUtils.genH2Path()));
- }catch (Exception e) {
- log.warn("[PowerJob] delete h2 workspace({}) failed, if server can't startup successfully, please delete it manually", OmsFileUtils.genH2Path(), e);
- }
}
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/OhMyServer.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/OhMyServer.java
index 98269a15..f4568e0e 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/OhMyServer.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/akka/OhMyServer.java
@@ -7,6 +7,7 @@ import com.github.kfcfans.powerjob.common.utils.NetUtils;
import com.github.kfcfans.powerjob.server.akka.actors.FriendActor;
import com.github.kfcfans.powerjob.server.akka.actors.ServerActor;
import com.github.kfcfans.powerjob.server.akka.actors.ServerTroubleshootingActor;
+import com.github.kfcfans.powerjob.server.common.PowerJobServerConfigKey;
import com.github.kfcfans.powerjob.server.common.utils.PropertyUtils;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Maps;
@@ -44,7 +45,7 @@ public class OhMyServer {
// 解析配置文件
PropertyUtils.init();
Properties properties = PropertyUtils.getProperties();
- int port = Integer.parseInt(properties.getProperty("oms.akka.port", "10086"));
+ int port = Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.AKKA_PORT, "10086"));
// 启动 ActorSystem
Map overrideConfig = Maps.newHashMap();
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/PowerJobServerConfigKey.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/PowerJobServerConfigKey.java
new file mode 100644
index 00000000..dabae0dd
--- /dev/null
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/PowerJobServerConfigKey.java
@@ -0,0 +1,27 @@
+package com.github.kfcfans.powerjob.server.common;
+
+/**
+ * 配置文件 key
+ *
+ * @author tjq
+ * @since 2020/8/2
+ */
+public class PowerJobServerConfigKey {
+
+ /**
+ * akka 端口号
+ */
+ public static final String AKKA_PORT = "oms.akka.port";
+ /**
+ * alarm bean 名称,多值逗号分隔
+ */
+ public static final String ALARM_BEAN_NAMES = "oms.alarm.bean.names";
+ /**
+ * 自定义数据库表前缀
+ */
+ public static final String TABLE_PREFIX = "oms.table-prefix";
+ /**
+ * 是否使用 mongoDB
+ */
+ public static final String MONGODB_ENABLE = "oms.mongodb.enable";
+}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/config/ThreadPoolConfig.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/config/ThreadPoolConfig.java
index f309233d..fa503d5e 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/config/ThreadPoolConfig.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/config/ThreadPoolConfig.java
@@ -14,7 +14,7 @@ import java.util.concurrent.*;
* 公用线程池配置
* omsTimingPool:用于执行定时任务的线程池
* omsCommonPool:用于执行普通任务的线程池
- * omsCommonPool:用于执行后台任务的线程池,这类任务对时间不敏感,慢慢执行细水长流即可
+ * omsBackgroundPool:用于执行后台任务的线程池,这类任务对时间不敏感,慢慢执行细水长流即可
* taskScheduler:用于定时调度的线程池
*
* @author tjq
@@ -59,7 +59,7 @@ public class ThreadPoolConfig {
public Executor initBackgroundPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
- executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors());
+ executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 2);
executor.setQueueCapacity(8192);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("omsBackgroundPool-");
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java
index 1f5a0f76..ea35028d 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java
@@ -1,13 +1,12 @@
package com.github.kfcfans.powerjob.server.common.utils;
-import org.apache.commons.lang3.StringUtils;
+import com.github.kfcfans.powerjob.common.utils.CommonUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.util.DigestUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
-import java.util.UUID;
/**
* 文件工具类,统一文件存放地址
@@ -49,17 +48,19 @@ public class OmsFileUtils {
* @return 临时目录
*/
public static String genTemporaryWorkPath() {
- String uuid = StringUtils.replace(UUID.randomUUID().toString(), "-", "");
- return genTemporaryPath() + uuid + "/";
+ return genTemporaryPath() + CommonUtils.genUUID() + "/";
}
/**
* 获取 H2 数据库工作目录
* @return H2 工作目录
*/
- public static String genH2Path() {
+ public static String genH2BasePath() {
return COMMON_PATH + "h2/";
}
+ public static String genH2WorkPath() {
+ return genH2BasePath() + CommonUtils.genUUID() + "/";
+ }
/**
* 将文本写入文件
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java
index f233bc99..06531499 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java
@@ -3,6 +3,7 @@ package com.github.kfcfans.powerjob.server.persistence.config;
import com.github.kfcfans.powerjob.server.common.utils.OmsFileUtils;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
+import org.apache.commons.io.FileUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
@@ -10,6 +11,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
+import java.io.File;
/**
* 多重数据源配置
@@ -34,14 +36,21 @@ public class MultiDatasourceConfig {
@Bean("omsLocalDatasource")
public DataSource initOmsLocalDatasource() {
+ String h2Path = OmsFileUtils.genH2WorkPath();
HikariConfig config = new HikariConfig();
config.setDriverClassName(H2_DRIVER_CLASS_NAME);
- config.setJdbcUrl(String.format(H2_JDBC_URL_PATTERN, OmsFileUtils.genH2Path()));
+ config.setJdbcUrl(String.format(H2_JDBC_URL_PATTERN, h2Path));
config.setAutoCommit(true);
// 池中最小空闲连接数量
config.setMinimumIdle(H2_MIN_SIZE);
// 池中最大连接数量
config.setMaximumPoolSize(H2_MAX_ACTIVE_SIZE);
+
+ // JVM 关闭时删除文件
+ try {
+ FileUtils.forceDeleteOnExit(new File(h2Path));
+ }catch (Exception ignore) {
+ }
return new HikariDataSource(config);
}
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/PowerJobPhysicalNamingStrategy.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/PowerJobPhysicalNamingStrategy.java
index 4eec2266..395487a0 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/PowerJobPhysicalNamingStrategy.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/PowerJobPhysicalNamingStrategy.java
@@ -1,5 +1,6 @@
package com.github.kfcfans.powerjob.server.persistence.config;
+import com.github.kfcfans.powerjob.server.common.PowerJobServerConfigKey;
import com.github.kfcfans.powerjob.server.common.utils.PropertyUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
@@ -34,7 +35,7 @@ public class PowerJobPhysicalNamingStrategy extends SpringPhysicalNamingStrategy
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
- String tablePrefix = PropertyUtils.getProperties().getProperty("oms.table-prefix");
+ String tablePrefix = PropertyUtils.getProperties().getProperty(PowerJobServerConfigKey.TABLE_PREFIX);
String text = name.getText();
String noDOText = StringUtils.endsWithIgnoreCase(text, "do") ? text.substring(0, text.length() - 2) : text;
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 650c63e7..a06d2766 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
@@ -1,6 +1,7 @@
package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.Data;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -17,7 +18,8 @@ import java.util.Date;
public class AppInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
private String appName;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java
index 6e46e094..93a64195 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java
@@ -1,6 +1,7 @@
package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.Data;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -17,7 +18,8 @@ import java.util.Date;
public class ContainerInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
// 所属的应用ID
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java
index 92c83797..5af69945 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java
@@ -4,6 +4,7 @@ import com.github.kfcfans.powerjob.common.InstanceStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -22,7 +23,8 @@ import java.util.Date;
public class InstanceInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
// 任务ID
@@ -33,7 +35,7 @@ public class InstanceInfoDO {
private Long instanceId;
// 任务实例参数
@Lob
- @Column(columnDefinition="TEXT")
+ @Column
private String instanceParams;
// 该任务实例的类型,普通/工作流(InstanceType)
@@ -46,7 +48,7 @@ public class InstanceInfoDO {
private Integer status;
// 执行结果(允许存储稍大的结果)
@Lob
- @Column(columnDefinition="TEXT")
+ @Column
private String result;
// 预计触发时间
private Long expectedTriggerTime;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java
index 7b9ed512..b5d2b171 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java
@@ -4,6 +4,7 @@ package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -23,7 +24,8 @@ public class JobInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
/* ************************** 任务基本信息 ************************** */
@@ -49,7 +51,7 @@ public class JobInfoDO {
private Integer processorType;
// 执行器信息(可能需要存储整个脚本文件)
@Lob
- @Column(columnDefinition="TEXT")
+ @Column
private String processorInfo;
/* ************************** 运行时配置 ************************** */
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java
index 95949f50..db0f1644 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java
@@ -2,6 +2,7 @@ package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -19,7 +20,8 @@ import java.util.Date;
public class OmsLockDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
private String lockName;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java
index 3a6882d4..683b1cb1 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java
@@ -2,6 +2,7 @@ package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -19,7 +20,8 @@ import java.util.Date;
public class ServerInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
/**
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java
index bed8a473..f2a6170f 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java
@@ -1,6 +1,7 @@
package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.Data;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -17,7 +18,8 @@ import java.util.Date;
public class UserInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
private String username;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java
index f87f2f99..f3c5d560 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java
@@ -3,6 +3,7 @@ package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -21,7 +22,8 @@ import java.util.Date;
public class WorkflowInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
private String wfName;
@@ -32,7 +34,7 @@ public class WorkflowInfoDO {
// 工作流的DAG图信息(点线式DAG的json)
@Lob
- @Column(columnDefinition="TEXT")
+ @Column
private String peDAG;
/* ************************** 定时参数 ************************** */
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java
index ff9d5651..5eacf323 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java
@@ -3,6 +3,7 @@ package com.github.kfcfans.powerjob.server.persistence.core.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.Date;
@@ -21,7 +22,8 @@ import java.util.Date;
public class WorkflowInstanceInfoDO {
@Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
+ @GenericGenerator(name = "native", strategy = "native")
private Long id;
// 任务所属应用的ID,冗余提高查询效率
private Long appId;
@@ -35,10 +37,10 @@ public class WorkflowInstanceInfoDO {
private Integer status;
@Lob
- @Column(columnDefinition="TEXT")
+ @Column
private String dag;
@Lob
- @Column(columnDefinition="TEXT")
+ @Column
private String result;
// 实际触发时间
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java
index a8e4ea96..71d7d8b8 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java
@@ -1,5 +1,6 @@
package com.github.kfcfans.powerjob.server.persistence.mongodb;
+import com.github.kfcfans.powerjob.server.common.PowerJobServerConfigKey;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Maps;
import com.mongodb.client.MongoDatabase;
@@ -13,10 +14,13 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
+import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
import java.io.*;
import java.util.Date;
import java.util.Map;
@@ -30,18 +34,24 @@ import java.util.function.Consumer;
*/
@Slf4j
@Service
-public class GridFsManager {
+public class GridFsManager implements InitializingBean {
+
+ @Resource
+ private Environment environment;
private MongoDatabase db;
+ private boolean available;
- private Map bucketCache = Maps.newConcurrentMap();
+ private final Map bucketCache = Maps.newConcurrentMap();
public static final String LOG_BUCKET = "log";
public static final String CONTAINER_BUCKET = "container";
@Autowired(required = false)
public void setMongoTemplate(MongoTemplate mongoTemplate) {
- this.db = mongoTemplate.getDb();
+ if (mongoTemplate != null) {
+ this.db = mongoTemplate.getDb();
+ }
}
/**
@@ -49,7 +59,7 @@ public class GridFsManager {
* @return true:可用;false:不可用
*/
public boolean available() {
- return db != null;
+ return available;
}
/**
@@ -109,12 +119,12 @@ public class GridFsManager {
ObjectId objectId = gridFSFile.getObjectId();
try {
bucket.delete(objectId);
- log.info("[GridFsHelper] deleted {}#{}", bucketName, objectId);
+ log.info("[GridFsManager] deleted {}#{}", bucketName, objectId);
}catch (Exception e) {
- log.error("[GridFsHelper] deleted {}#{} failed.", bucketName, objectId, e);
+ log.error("[GridFsManager] deleted {}#{} failed.", bucketName, objectId, e);
}
});
- log.info("[GridFsHelper] clean bucket({}) successfully, delete all files before {}, using {}.", bucketName, date, sw.stop());
+ log.info("[GridFsManager] clean bucket({}) successfully, delete all files before {}, using {}.", bucketName, date, sw.stop());
}
public boolean exists(String bucketName, String fileName) {
@@ -131,4 +141,11 @@ public class GridFsManager {
private GridFSBucket getBucket(String bucketName) {
return bucketCache.computeIfAbsent(bucketName, ignore -> GridFSBuckets.create(db, bucketName));
}
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ String enable = environment.getProperty(PowerJobServerConfigKey.MONGODB_ENABLE, Boolean.FALSE.toString());
+ available = Boolean.TRUE.toString().equals(enable) && db != null;
+ log.info("[GridFsManager] available: {}, db: {}", available, db);
+ }
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/InstanceLogService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/InstanceLogService.java
index 6a71ad1f..c05fe17d 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/InstanceLogService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/InstanceLogService.java
@@ -193,6 +193,7 @@ public class InstanceLogService {
try {
instanceId2LastReportTime.remove(instanceId);
CommonUtils.executeWithRetry0(() -> localInstanceLogRepository.deleteByInstanceId(instanceId));
+ log.warn("[InstanceLog-{}] delete local instanceLog successfully.", instanceId);
}catch (Exception e) {
log.warn("[InstanceLog-{}] delete local instanceLog failed.", instanceId, e);
}
@@ -308,7 +309,7 @@ public class InstanceLogService {
@Async("omsTimingPool")
- @Scheduled(fixedDelay = 60000)
+ @Scheduled(fixedDelay = 120000)
public void timingCheck() {
// 定时删除秒级任务的日志
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarm.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarm.java
new file mode 100644
index 00000000..1187d41e
--- /dev/null
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarm.java
@@ -0,0 +1,36 @@
+package com.github.kfcfans.powerjob.server.service.alarm;
+
+import com.alibaba.fastjson.JSONObject;
+import com.github.kfcfans.powerjob.common.OmsSerializable;
+import com.github.kfcfans.powerjob.common.utils.CommonUtils;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 报警内容
+ *
+ * @author tjq
+ * @since 2020/8/1
+ */
+public interface Alarm extends OmsSerializable {
+
+ String fetchTitle();
+
+ default String fetchContent() {
+ StringBuilder sb = new StringBuilder();
+ JSONObject content = JSONObject.parseObject(JSONObject.toJSONString(this));
+ content.forEach((key, originWord) -> {
+ sb.append(key).append(": ");
+ String word = String.valueOf(originWord);
+ if (StringUtils.endsWithIgnoreCase(key, "time") || StringUtils.endsWithIgnoreCase(key, "date")) {
+ try {
+ if (originWord instanceof Long) {
+ word = CommonUtils.formatTime((Long) originWord);
+ }
+ }catch (Exception ignore) {
+ }
+ }
+ sb.append(word).append("\n\r");
+ });
+ return sb.toString();
+ }
+}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarmable.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarmable.java
index 2349a018..d7fa2f43 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarmable.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/Alarmable.java
@@ -12,17 +12,6 @@ import java.util.List;
*/
public interface Alarmable {
- /**
- * 任务执行失败报警
- * @param content 任务实例相关信息
- * @param targetUserList 目标用户列表
- */
- void onJobInstanceFailed(JobInstanceAlarmContent content, List targetUserList);
+ void onFailed(Alarm alarm, List targetUserList);
- /**
- * 工作流执行失败报警
- * @param content 工作流实例相关信息
- * @param targetUserList 目标用户列表
- */
- void onWorkflowInstanceFailed(WorkflowInstanceAlarmContent content, List targetUserList);
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/DefaultMailAlarmService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/DefaultMailAlarmService.java
index 1c494f62..c643ddc0 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/DefaultMailAlarmService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/DefaultMailAlarmService.java
@@ -1,15 +1,16 @@
package com.github.kfcfans.powerjob.server.service.alarm;
-import com.github.kfcfans.powerjob.common.utils.JsonUtils;
import com.github.kfcfans.powerjob.server.persistence.core.model.UserInfoDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import javax.annotation.Resource;
import java.util.List;
/**
@@ -22,37 +23,18 @@ import java.util.List;
@Service("omsDefaultMailAlarmService")
public class DefaultMailAlarmService implements Alarmable {
+ @Resource
+ private Environment environment;
+
private JavaMailSender javaMailSender;
- @Value("${spring.mail.username}")
private String from;
-
- private static final String MAIL_TITLE = "OhMyScheduler AlarmService";
- private static final String JOB_INSTANCE_FAILED_CONTENT_PATTERN = "Job run failed, detail is: %s";
- private static final String WF_INSTANCE_FAILED_CONTENT_PATTERN = "Workflow run failed, detail is: %s";
-
- @Autowired(required = false)
- public DefaultMailAlarmService(JavaMailSender javaMailSender) {
- this.javaMailSender = javaMailSender;
- }
+ private static final String FROM_KEY = "spring.mail.username";
@Override
- public void onJobInstanceFailed(JobInstanceAlarmContent content, List targetUserList) {
- String msg = String.format(JOB_INSTANCE_FAILED_CONTENT_PATTERN, JsonUtils.toJSONString(content));
- sendMail(msg, targetUserList);
- }
-
- @Override
- public void onWorkflowInstanceFailed(WorkflowInstanceAlarmContent content, List targetUserList) {
- String msg = String.format(WF_INSTANCE_FAILED_CONTENT_PATTERN, JsonUtils.toJSONString(content));
- sendMail(msg, targetUserList);
- }
-
- private void sendMail(String msg, List targetUserList) {
-
- log.debug("[OmsMailAlarmService] msg: {}, to: {}", msg, targetUserList);
-
- if (CollectionUtils.isEmpty(targetUserList) || javaMailSender == null) {
+ public void onFailed(Alarm alarm, List targetUserList) {
+ initFrom();
+ if (CollectionUtils.isEmpty(targetUserList) || javaMailSender == null || StringUtils.isEmpty(from)) {
return;
}
@@ -60,12 +42,24 @@ public class DefaultMailAlarmService implements Alarmable {
try {
sm.setFrom(from);
sm.setTo(targetUserList.stream().map(UserInfoDO::getEmail).toArray(String[]::new));
- sm.setSubject(MAIL_TITLE);
- sm.setText(msg);
+ sm.setSubject(alarm.fetchTitle());
+ sm.setText(alarm.fetchContent());
javaMailSender.send(sm);
}catch (Exception e) {
log.error("[OmsMailAlarmService] send mail({}) failed, reason is {}", sm, e.getMessage());
}
}
+
+ @Autowired(required = false)
+ public void setJavaMailSender(JavaMailSender javaMailSender) {
+ this.javaMailSender = javaMailSender;
+ }
+
+ // 不能直接使用 @Value 注入,不存在的时候会报错
+ private void initFrom() {
+ if (StringUtils.isEmpty(from)) {
+ from = environment.getProperty(FROM_KEY);
+ }
+ }
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/JobInstanceAlarmContent.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/JobInstanceAlarm.java
similarity index 87%
rename from powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/JobInstanceAlarmContent.java
rename to powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/JobInstanceAlarm.java
index 1ff8011e..fc6524ed 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/JobInstanceAlarmContent.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/JobInstanceAlarm.java
@@ -9,7 +9,7 @@ import lombok.Data;
* @since 2020/4/30
*/
@Data
-public class JobInstanceAlarmContent {
+public class JobInstanceAlarm implements Alarm {
// 应用ID
private long appId;
// 任务ID
@@ -43,4 +43,9 @@ public class JobInstanceAlarmContent {
private Long finishedTime;
// TaskTracker地址
private String taskTrackerAddress;
+
+ @Override
+ public String fetchTitle() {
+ return "PowerJob AlarmService: Job Running Failed";
+ }
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/OmsCenterAlarmService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/OmsCenterAlarmService.java
index 8b18203e..2f89350f 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/OmsCenterAlarmService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/OmsCenterAlarmService.java
@@ -1,15 +1,17 @@
package com.github.kfcfans.powerjob.server.service.alarm;
+import com.github.kfcfans.powerjob.server.common.PowerJobServerConfigKey;
+import com.github.kfcfans.powerjob.server.common.SJ;
import com.github.kfcfans.powerjob.server.common.utils.SpringUtils;
import com.github.kfcfans.powerjob.server.persistence.core.model.UserInfoDO;
-import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
-import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
import java.util.List;
/**
@@ -22,36 +24,19 @@ import java.util.List;
@Service("omsCenterAlarmService")
public class OmsCenterAlarmService implements Alarmable {
- @Setter
- @Value("${oms.alarm.bean.names}")
- private String beanNames;
+ @Resource
+ private Environment environment;
private List alarmableList;
private volatile boolean initialized = false;
- public OmsCenterAlarmService() {
- }
-
@Async("omsCommonPool")
@Override
- public void onJobInstanceFailed(JobInstanceAlarmContent content, List targetUserList) {
+ public void onFailed(Alarm alarm, List targetUserList) {
init();
alarmableList.forEach(alarmable -> {
try {
- alarmable.onJobInstanceFailed(content, targetUserList);
- }catch (Exception e) {
- log.warn("[OmsCenterAlarmService] alarm failed.", e);
- }
- });
- }
-
- @Async("omsCommonPool")
- @Override
- public void onWorkflowInstanceFailed(WorkflowInstanceAlarmContent content, List targetUserList) {
- init();
- alarmableList.forEach(alarmable -> {
- try {
- alarmable.onWorkflowInstanceFailed(content, targetUserList);
+ alarmable.onFailed(alarm, targetUserList);
}catch (Exception e) {
log.warn("[OmsCenterAlarmService] alarm failed.", e);
}
@@ -73,17 +58,20 @@ public class OmsCenterAlarmService implements Alarmable {
}
alarmableList = Lists.newLinkedList();
- Splitter.on(",").split(beanNames).forEach(beanName -> {
- try {
- Alarmable bean = (Alarmable) SpringUtils.getBean(beanName);
- alarmableList.add(bean);
- log.info("[OmsCenterAlarmService] load Alarmable for bean: {} successfully.", beanName);
- }catch (Exception e) {
- log.warn("[OmsCenterAlarmService] initialize Alarmable for bean: {} failed.", beanName, e);
- }
- });
-
+ String beanNames = environment.getProperty(PowerJobServerConfigKey.ALARM_BEAN_NAMES);
+ if (StringUtils.isNotEmpty(beanNames)) {
+ SJ.commaSplitter.split(beanNames).forEach(beanName -> {
+ try {
+ Alarmable bean = (Alarmable) SpringUtils.getBean(beanName);
+ alarmableList.add(bean);
+ log.info("[OmsCenterAlarmService] load Alarmable for bean: {} successfully.", beanName);
+ }catch (Exception e) {
+ log.warn("[OmsCenterAlarmService] initialize Alarmable for bean: {} failed.", beanName, e);
+ }
+ });
+ }
initialized = true;
}
}
+
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/WorkflowInstanceAlarmContent.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/WorkflowInstanceAlarm.java
similarity index 84%
rename from powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/WorkflowInstanceAlarmContent.java
rename to powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/WorkflowInstanceAlarm.java
index 4a338a20..0237c5dc 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/WorkflowInstanceAlarmContent.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/alarm/WorkflowInstanceAlarm.java
@@ -10,7 +10,7 @@ import lombok.Data;
* @since 2020/6/12
*/
@Data
-public class WorkflowInstanceAlarmContent {
+public class WorkflowInstanceAlarm implements Alarm {
private String workflowName;
@@ -34,4 +34,9 @@ public class WorkflowInstanceAlarmContent {
private Integer timeExpressionType;
// 时间表达式,CRON/NULL/LONG/LONG
private String timeExpression;
+
+ @Override
+ public String fetchTitle() {
+ return "PowerJob AlarmService: Workflow Running Failed";
+ }
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/ClusterStatusHolder.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/ClusterStatusHolder.java
index abaabc61..9bfea3f6 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/ClusterStatusHolder.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/ClusterStatusHolder.java
@@ -22,13 +22,13 @@ import java.util.Map;
public class ClusterStatusHolder {
// 集群所属的应用名称
- private String appName;
+ private final String appName;
// 集群中所有机器的健康状态
- private Map address2Metrics;
+ private final Map address2Metrics;
// 集群中所有机器的容器部署状态 containerId -> (workerAddress -> containerInfo)
private Map> containerId2Infos;
// 集群中所有机器的最后心跳时间
- private Map address2ActiveTime;
+ private final Map address2ActiveTime;
private static final long WORKER_TIMEOUT_MS = 60000;
@@ -78,11 +78,14 @@ public class ClusterStatusHolder {
address2Metrics.forEach((address, metrics) -> {
if (timeout(address)) {
+ log.info("[ClusterStatusHolder] worker(address={},metrics={}) was filtered because of timeout, last active time is {}.", address, metrics, address2ActiveTime.get(address));
return;
}
// 判断指标
if (metrics.available(minCPUCores, minMemorySpace, minDiskSpace)) {
workers.add(address);
+ }else {
+ log.info("[ClusterStatusHolder] worker(address={},metrics={}) was filtered by config(minCPUCores={},minMemory={},minDiskSpace={})", address, metrics, minCPUCores, minMemorySpace, minDiskSpace);
}
});
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/WorkerManagerService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/WorkerManagerService.java
index 02b667fc..0f7124c1 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/WorkerManagerService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/ha/WorkerManagerService.java
@@ -99,4 +99,8 @@ public class WorkerManagerService {
public static void cleanUp() {
appId2ClusterStatus.values().forEach(ClusterStatusHolder::release);
}
+
+ public static Map getAppId2ClusterStatus() {
+ return appId2ClusterStatus;
+ }
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/id/IdGenerateService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/id/IdGenerateService.java
index 51af339e..e56462fa 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/id/IdGenerateService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/id/IdGenerateService.java
@@ -19,7 +19,7 @@ import org.springframework.stereotype.Service;
@Service
public class IdGenerateService {
- private SnowFlakeIdGenerator snowFlakeIdGenerator;
+ private final SnowFlakeIdGenerator snowFlakeIdGenerator;
private static final int DATA_CENTER_ID = 0;
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceManager.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceManager.java
index ceda11e4..6f752a3d 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceManager.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceManager.java
@@ -12,7 +12,7 @@ import com.github.kfcfans.powerjob.server.service.DispatchService;
import com.github.kfcfans.powerjob.server.service.InstanceLogService;
import com.github.kfcfans.powerjob.server.service.UserService;
import com.github.kfcfans.powerjob.server.service.alarm.Alarmable;
-import com.github.kfcfans.powerjob.server.service.alarm.JobInstanceAlarmContent;
+import com.github.kfcfans.powerjob.server.service.alarm.JobInstanceAlarm;
import com.github.kfcfans.powerjob.server.service.timing.schedule.HashedWheelTimerHolder;
import com.github.kfcfans.powerjob.server.service.workflow.WorkflowInstanceManager;
import lombok.extern.slf4j.Slf4j;
@@ -162,12 +162,12 @@ public class InstanceManager {
}
InstanceInfoDO instanceInfo = instanceInfoRepository.findByInstanceId(instanceId);
- JobInstanceAlarmContent content = new JobInstanceAlarmContent();
+ JobInstanceAlarm content = new JobInstanceAlarm();
BeanUtils.copyProperties(jobInfo, content);
BeanUtils.copyProperties(instanceInfo, content);
List userList = SpringUtils.getBean(UserService.class).fetchNotifyUserList(jobInfo.getNotifyUserIds());
- omsCenterAlarmService.onJobInstanceFailed(content, userList);
+ omsCenterAlarmService.onFailed(content, userList);
}
// 主动移除缓存,减小内存占用
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java
index 97a21848..a9ebc414 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/instance/InstanceService.java
@@ -15,7 +15,10 @@ import com.github.kfcfans.powerjob.server.akka.OhMyServer;
import com.github.kfcfans.powerjob.server.common.constans.InstanceType;
import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerFuture;
import com.github.kfcfans.powerjob.server.persistence.core.model.InstanceInfoDO;
+import com.github.kfcfans.powerjob.server.persistence.core.model.JobInfoDO;
import com.github.kfcfans.powerjob.server.persistence.core.repository.InstanceInfoRepository;
+import com.github.kfcfans.powerjob.server.persistence.core.repository.JobInfoRepository;
+import com.github.kfcfans.powerjob.server.service.DispatchService;
import com.github.kfcfans.powerjob.server.service.id.IdGenerateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@@ -40,11 +43,15 @@ import static com.github.kfcfans.powerjob.common.InstanceStatus.STOPPED;
@Service
public class InstanceService {
+ @Resource
+ private DispatchService dispatchService;
@Resource
private IdGenerateService idGenerateService;
@Resource
private InstanceManager instanceManager;
@Resource
+ private JobInfoRepository jobInfoRepository;
+ @Resource
private InstanceInfoRepository instanceInfoRepository;
/**
@@ -121,6 +128,34 @@ public class InstanceService {
}
}
+ /**
+ * 重试任务(只有结束的任务运行重试)
+ * @param instanceId 任务实例ID
+ */
+ public void retryInstance(Long instanceId) {
+ InstanceInfoDO instanceInfo = fetchInstanceInfo(instanceId);
+ if (!InstanceStatus.finishedStatus.contains(instanceInfo.getStatus())) {
+ throw new OmsException("Only stopped instance can be retry!");
+ }
+ // 暂时不支持工作流任务的重试
+ if (instanceInfo.getWfInstanceId() != null) {
+ throw new OmsException("Workflow's instance do not support retry!");
+ }
+
+ instanceInfo.setStatus(InstanceStatus.WAITING_DISPATCH.getV());
+ instanceInfo.setExpectedTriggerTime(System.currentTimeMillis());
+ instanceInfo.setFinishedTime(null);
+ instanceInfo.setActualTriggerTime(null);
+ instanceInfo.setTaskTrackerAddress(null);
+ instanceInfo.setResult(null);
+ instanceInfoRepository.saveAndFlush(instanceInfo);
+
+ // 派发任务
+ Long jobId = instanceInfo.getJobId();
+ JobInfoDO jobInfo = jobInfoRepository.findById(jobId).orElseThrow(() -> new OmsException("can't find job info by jobId: " + jobId));
+ dispatchService.redispatch(jobInfo, instanceId, instanceInfo.getRunningTimes());
+ }
+
/**
* 取消任务实例的运行
* 接口使用条件:调用接口时间与待取消任务的预计执行时间有一定时间间隔,否则不保证可靠性!
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/workflow/WorkflowInstanceManager.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/workflow/WorkflowInstanceManager.java
index 955c831b..1f11b1f2 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/workflow/WorkflowInstanceManager.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/service/workflow/WorkflowInstanceManager.java
@@ -20,7 +20,7 @@ import com.github.kfcfans.powerjob.server.persistence.core.repository.WorkflowIn
import com.github.kfcfans.powerjob.server.service.DispatchService;
import com.github.kfcfans.powerjob.server.service.UserService;
import com.github.kfcfans.powerjob.server.service.alarm.Alarmable;
-import com.github.kfcfans.powerjob.server.service.alarm.WorkflowInstanceAlarmContent;
+import com.github.kfcfans.powerjob.server.service.alarm.WorkflowInstanceAlarm;
import com.github.kfcfans.powerjob.server.service.id.IdGenerateService;
import com.github.kfcfans.powerjob.server.service.instance.InstanceService;
import com.google.common.collect.LinkedListMultimap;
@@ -332,14 +332,14 @@ public class WorkflowInstanceManager {
// 报警
try {
workflowInfoRepository.findById(wfInstance.getWorkflowId()).ifPresent(wfInfo -> {
- WorkflowInstanceAlarmContent content = new WorkflowInstanceAlarmContent();
+ WorkflowInstanceAlarm content = new WorkflowInstanceAlarm();
BeanUtils.copyProperties(wfInfo, content);
BeanUtils.copyProperties(wfInstance, content);
content.setResult(result);
List userList = userService.fetchNotifyUserList(wfInfo.getNotifyUserIds());
- omsCenterAlarmService.onWorkflowInstanceFailed(content, userList);
+ omsCenterAlarmService.onFailed(content, userList);
});
}catch (Exception ignore) {
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/ControllerExceptionHandler.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/ControllerExceptionHandler.java
index 65a7c682..3ec9821d 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/ControllerExceptionHandler.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/ControllerExceptionHandler.java
@@ -5,6 +5,7 @@ import com.github.kfcfans.powerjob.common.response.ResultDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.messaging.handler.annotation.support.MethodArgumentTypeMismatchException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@@ -28,6 +29,8 @@ public class ControllerExceptionHandler {
log.warn("[ControllerException] http request failed, message is {}.", e.getMessage());
} else if (e instanceof HttpMessageNotReadableException || e instanceof MethodArgumentTypeMismatchException) {
log.warn("[ControllerException] invalid http request params, exception is {}.", e.getMessage());
+ } else if (e instanceof HttpRequestMethodNotSupportedException) {
+ log.warn("[ControllerException] invalid http request method, exception is {}.", e.getMessage());
} else {
log.error("[ControllerException] http request failed.", e);
}
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 5123c123..5c448653 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
@@ -36,7 +36,7 @@ public class AppInfoController {
@Resource
private AppInfoRepository appInfoRepository;
- private static final int MAX_APP_NUM = 50;
+ private static final int MAX_APP_NUM = 200;
@PostMapping("/save")
public ResultDTO saveAppInfo(@RequestBody ModifyAppInfoRequest req) {
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java
index 500a2ab5..6f6f389c 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/InstanceController.java
@@ -64,6 +64,12 @@ public class InstanceController {
return ResultDTO.success(null);
}
+ @GetMapping("/retry")
+ public ResultDTO retryInstance(Long instanceId) {
+ instanceService.retryInstance(instanceId);
+ return ResultDTO.success(null);
+ }
+
@GetMapping("/detail")
public ResultDTO getInstanceDetail(String instanceId) {
return ResultDTO.success(InstanceDetailVO.from(instanceService.getInstanceDetail(Long.valueOf(instanceId))));
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 b6bac2a4..40fd0b6a 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
@@ -101,6 +101,13 @@ public class OpenAPIController {
return ResultDTO.success(null);
}
+ @PostMapping(OpenAPIConstant.RETRY_INSTANCE)
+ public ResultDTO retryInstance(Long instanceId, Long appId) {
+ checkInstanceIdValid(instanceId, appId);
+ instanceService.retryInstance(instanceId);
+ return ResultDTO.success(null);
+ }
+
@PostMapping(OpenAPIConstant.FETCH_INSTANCE_STATUS)
public ResultDTO fetchInstanceStatus(Long instanceId) {
InstanceStatus instanceStatus = instanceService.getInstanceStatus(instanceId);
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/ServerController.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/ServerController.java
index d98cb025..6cf50dce 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/ServerController.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/controller/ServerController.java
@@ -1,15 +1,18 @@
package com.github.kfcfans.powerjob.server.web.controller;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.github.kfcfans.powerjob.common.response.ResultDTO;
import com.github.kfcfans.powerjob.common.utils.CommonUtils;
import com.github.kfcfans.powerjob.common.utils.NetUtils;
import com.github.kfcfans.powerjob.server.akka.OhMyServer;
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.ha.ServerSelectService;
-import com.github.kfcfans.powerjob.common.response.ResultDTO;
+import com.github.kfcfans.powerjob.server.service.ha.WorkerManagerService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@@ -51,12 +54,17 @@ public class ServerController {
}
@GetMapping("/hello")
- public ResultDTO ping() {
+ public ResultDTO ping(@RequestParam(required = false) boolean debug) {
JSONObject res = new JSONObject();
res.put("localHost", NetUtils.getLocalHost());
res.put("actorSystemAddress", OhMyServer.getActorSystemAddress());
res.put("serverTime", CommonUtils.formatTime(System.currentTimeMillis()));
res.put("serverTimeZone", TimeZone.getDefault().getDisplayName());
+ res.put("appIds", WorkerManagerService.getAppId2ClusterStatus().keySet());
+ if (debug) {
+ res.put("appId2ClusterInfo", JSON.parseObject(JSON.toJSONString(WorkerManagerService.getAppId2ClusterStatus())));
+
+ }
return ResultDTO.success(res);
}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/WorkerStatusVO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/WorkerStatusVO.java
index 258bdc2d..5b98c3a1 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/WorkerStatusVO.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/web/response/WorkerStatusVO.java
@@ -25,37 +25,35 @@ public class WorkerStatusVO {
private int status;
// 12.3%(4 cores)
- private static final String CPU_FORMAT = "%s%%(%d cores)";
+ private static final String CPU_FORMAT = "%s / %s cores";
// 27.7%(2.9/8.0 GB)
- private static final String OTHER_FORMAT = "%s%%(%s/%s GB)";
+ private static final String OTHER_FORMAT = "%s%%(%s / %s GB)";
private static final DecimalFormat df = new DecimalFormat("#.#");
- private static final double threshold = 0.8;
+ private static final double THRESHOLD = 0.8;
public WorkerStatusVO(String address, SystemMetrics systemMetrics) {
+ this.status = 1;
this.address = address;
-
- String cpuL = df.format(systemMetrics.getCpuLoad() * 100);
- this.cpuLoad = String.format(CPU_FORMAT, cpuL, systemMetrics.getCpuProcessors());
-
+ this.cpuLoad = String.format(CPU_FORMAT, df.format(systemMetrics.getCpuLoad()), systemMetrics.getCpuProcessors());
+ if (systemMetrics.getCpuLoad() > systemMetrics.getCpuProcessors() * THRESHOLD) {
+ this.status ++;
+ }
String menL = df.format(systemMetrics.getJvmMemoryUsage() * 100);
String menUsed = df.format(systemMetrics.getJvmUsedMemory());
String menMax = df.format(systemMetrics.getJvmMaxMemory());
this.memoryLoad = String.format(OTHER_FORMAT, menL, menUsed, menMax);
+ if (systemMetrics.getJvmMemoryUsage() > THRESHOLD) {
+ this.status ++;
+ }
String diskL = df.format(systemMetrics.getDiskUsage() * 100);
String diskUsed = df.format(systemMetrics.getDiskUsed());
String diskMax = df.format(systemMetrics.getDiskTotal());
this.diskLoad = String.format(OTHER_FORMAT, diskL, diskUsed, diskMax);
-
-
- if (systemMetrics.getCpuLoad() < threshold && systemMetrics.getDiskUsage() < threshold && systemMetrics.getJvmMemoryUsage() < threshold) {
- status = 1;
- }else if (systemMetrics.getCpuLoad() > threshold && systemMetrics.getDiskUsage() > threshold && systemMetrics.getJvmMemoryUsage() > threshold) {
- status = 3;
- }else {
- status = 2;
+ if (systemMetrics.getDiskUsage() > THRESHOLD) {
+ this.status ++;
}
}
}
diff --git a/powerjob-server/src/main/resources/application-daily.properties b/powerjob-server/src/main/resources/application-daily.properties
index cb7778b6..6b6cbba5 100644
--- a/powerjob-server/src/main/resources/application-daily.properties
+++ b/powerjob-server/src/main/resources/application-daily.properties
@@ -3,19 +3,20 @@ logging.config=classpath:logback-dev.xml
####### 外部数据库配置(需要用户更改为自己的数据库配置) #######
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
-####### mongoDB配置,非核心依赖,可移除 #######
+####### mongoDB配置,非核心依赖,通过配置 oms.mongodb.enable=false 来关闭 #######
+oms.mongodb.enable=true
spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-daily
-####### 邮件配置(启用邮件报警则需要) #######
+####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
spring.mail.host=smtp.163.com
-spring.mail.username=zqq
-spring.mail.password=qqz
+spring.mail.username=zqq@163.com
+spring.mail.password=GOFZPNARMVKCGONV
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
diff --git a/powerjob-server/src/main/resources/application-pre.properties b/powerjob-server/src/main/resources/application-pre.properties
index f2d33b88..bbba59e8 100644
--- a/powerjob-server/src/main/resources/application-pre.properties
+++ b/powerjob-server/src/main/resources/application-pre.properties
@@ -3,16 +3,17 @@ logging.config=classpath:logback-product.xml
####### 数据库配置 #######
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.core.jdbc-url=jdbc:mysql://remotehost:3306/powerjob-pre?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.core.jdbc-url=jdbc:mysql://remotehost:3306/powerjob-pre?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
-####### mongoDB配置,非核心依赖,可移除 #######
+####### mongoDB配置,非核心依赖,通过配置 oms.mongodb.enable=false 来关闭 #######
+oms.mongodb.enable=true
spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-pre
-####### 邮件配置(启用邮件报警则需要) #######
+####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
spring.mail.host=smtp.qq.com
spring.mail.username=zqq
spring.mail.password=qqz
diff --git a/powerjob-server/src/main/resources/application-product.properties b/powerjob-server/src/main/resources/application-product.properties
index 0a4e2556..3352aaf2 100644
--- a/powerjob-server/src/main/resources/application-product.properties
+++ b/powerjob-server/src/main/resources/application-product.properties
@@ -3,16 +3,17 @@ logging.config=classpath:logback-product.xml
####### 数据库配置 #######
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
-####### mongoDB配置,非核心依赖,可移除 #######
+####### mongoDB配置,非核心依赖,通过配置 oms.mongodb.enable=false 来关闭 #######
+oms.mongodb.enable=true
spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-product
-####### 邮件配置(启用邮件报警则需要) #######
+####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
spring.mail.host=smtp.qq.com
spring.mail.username=zqq
spring.mail.password=qqz
diff --git a/powerjob-server/src/main/resources/static/js/10.js b/powerjob-server/src/main/resources/static/js/10.js
index 0802fc5b..e383ca62 100644
--- a/powerjob-server/src/main/resources/static/js/10.js
+++ b/powerjob-server/src/main/resources/static/js/10.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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: \"JobManager\",\n data: function data() {\n return {\n modifiedJobFormVisible: false,\n // 新建任务对象\n modifiedJobForm: {\n id: undefined,\n jobName: \"\",\n jobDescription: \"\",\n appId: this.$store.state.appInfo.id,\n jobParams: \"\",\n timeExpressionType: \"\",\n timeExpression: \"\",\n executeType: \"\",\n processorType: \"\",\n processorInfo: \"\",\n maxInstanceNum: 0,\n concurrency: 5,\n instanceTimeLimit: 0,\n instanceRetryNum: 0,\n taskRetryNum: 1,\n minCpuCores: 0,\n minMemorySpace: 0,\n minDiskSpace: 0,\n enable: true,\n designatedWorkers: \"\",\n maxWorkerCount: 0,\n notifyUserIds: []\n },\n // 任务查询请求对象\n jobQueryContent: {\n appId: this.$store.state.appInfo.id,\n index: 0,\n pageSize: 10,\n jobId: undefined,\n keyword: undefined\n },\n // 任务列表(查询结果),包含index、pageSize、totalPages、totalItems、data(List类型)\n jobInfoPageResult: {\n pageSize: 10,\n totalItems: 0,\n data: []\n },\n // 时间表达式选择类型\n timeExpressionTypeOptions: [{\n key: \"API\",\n label: \"API\"\n }, {\n key: \"CRON\",\n label: \"CRON\"\n }, {\n key: \"FIX_RATE\",\n label: this.$t('message.fixRate')\n }, {\n key: \"FIX_DELAY\",\n label: this.$t('message.fixDelay')\n }, {\n key: \"WORKFLOW\",\n label: this.$t('message.workflow')\n }],\n // 处理器类型\n processorTypeOptions: [{\n key: \"EMBEDDED_JAVA\",\n label: \"JAVA\"\n }, {\n key: \"JAVA_CONTAINER\",\n label: this.$t('message.javaContainer')\n }, {\n key: \"SHELL\",\n label: \"SHELL\"\n }, {\n key: \"PYTHON\",\n label: \"PYTHON\"\n }],\n // 执行方式类型\n executeTypeOptions: [{\n key: \"STANDALONE\",\n label: this.$t('message.standalone')\n }, {\n key: \"BROADCAST\",\n label: this.$t('message.broadcast')\n }, {\n key: \"MAP\",\n label: this.$t('message.map')\n }, {\n key: \"MAP_REDUCE\",\n label: this.$t('message.mapReduce')\n }],\n // 用户列表\n userList: []\n };\n },\n methods: {\n // 保存变更,包括新增和修改\n saveJob: function saveJob() {\n var _this = this;\n\n var that = this;\n this.axios.post(\"/job/save\", this.modifiedJobForm).then(function () {\n that.modifiedJobFormVisible = false;\n that.$message.success(_this.$t('message.success')); // 重新加载数据\n\n that.listJobInfos();\n }, function () {\n return that.modifiedJobFormVisible = false;\n });\n },\n // 列出符合当前搜索条件的任务\n listJobInfos: function listJobInfos() {\n var that = this;\n this.axios.post(\"/job/list\", this.jobQueryContent).then(function (res) {\n that.jobInfoPageResult = res;\n });\n },\n // 修改任务状态\n changeJobStatus: function changeJobStatus(data) {\n // switch 会自动更改 enable 的值\n var that = this;\n\n if (data.enable === false) {\n // 仅有,有特殊逻辑(关闭秒级任务),走单独接口\n that.axios.get(\"/job/disable?jobId=\" + data.id).then(function () {\n return that.listJobInfos();\n });\n } else {\n // 启用,则发起正常的保存操作\n this.modifiedJobForm = data;\n this.saveJob();\n }\n },\n // 新增任务,去除旧数据\n onClickNewJob: function onClickNewJob() {\n this.modifiedJobForm.id = undefined;\n this.modifiedJobForm.jobName = undefined;\n this.modifiedJobForm.jobDescription = undefined;\n this.modifiedJobForm.jobParams = undefined;\n this.modifiedJobForm.timeExpression = undefined;\n this.modifiedJobForm.timeExpressionType = undefined;\n this.modifiedJobForm.processorInfo = undefined;\n this.modifiedJobForm.processorType = undefined;\n this.modifiedJobForm.executeType = undefined;\n this.modifiedJobFormVisible = true;\n },\n // 点击 编辑按钮\n onClickModify: function onClickModify(data) {\n // 修复点击编辑后再点击新增 行数据被清空 的问题\n this.modifiedJobForm = JSON.parse(JSON.stringify(data));\n this.modifiedJobFormVisible = true;\n },\n // 点击 立即运行按钮\n onClickRun: function onClickRun(data) {\n var _this2 = this;\n\n var that = this;\n var url = \"/job/run?jobId=\" + data.id;\n this.axios.get(url).then(function () {\n return that.$message.success(_this2.$t('message.success'));\n });\n },\n // 点击 删除任务\n onClickDeleteJob: function onClickDeleteJob(data) {\n var _this3 = this;\n\n var that = this;\n var url = \"/job/delete?jobId=\" + data.id;\n this.axios.get(url).then(function () {\n that.$message.success(_this3.$t('message.success'));\n that.listJobInfos();\n });\n },\n // 点击 换页\n onClickChangePage: function onClickChangePage(index) {\n // 后端从0开始,前端从1开始\n this.jobQueryContent.index = index - 1;\n this.listJobInfos();\n },\n // 点击重置按钮\n onClickReset: function onClickReset() {\n this.jobQueryContent.keyword = undefined;\n this.jobQueryContent.jobId = undefined;\n this.listJobInfos();\n },\n verifyPlaceholder: function verifyPlaceholder(processorType) {\n var res;\n\n switch (processorType) {\n case \"EMBEDDED_JAVA\":\n res = this.$t('message.javaProcessorInfoPLH');\n break;\n\n case \"JAVA_CONTAINER\":\n res = this.$t('message.containerProcessorInfoPLH');\n break;\n\n case \"SHELL\":\n res = this.$t('message.shellProcessorInfoPLH');\n break;\n\n case \"PYTHON\":\n res = this.$t('message.pythonProcessorInfoPLH');\n }\n\n return res;\n },\n // 翻译执行类型\n translateExecuteType: function translateExecuteType(executeType) {\n switch (executeType) {\n case \"STANDALONE\":\n return this.$t('message.standalone');\n\n case \"BROADCAST\":\n return this.$t('message.broadcast');\n\n case \"MAP_REDUCE\":\n return this.$t('message.mapReduce');\n\n case \"MAP\":\n return this.$t('message.map');\n\n default:\n return \"UNKNOWN\";\n }\n },\n // 翻译处理器类型\n translateProcessorType: function translateProcessorType(processorType) {\n if (processorType === \"JAVA_CONTAINER\") {\n return this.$t('message.javaContainer');\n }\n\n return processorType;\n }\n },\n mounted: function mounted() {\n // 加载用户信息\n var that = this;\n that.axios.get(\"/user/list\").then(function (res) {\n return that.userList = res;\n }); // 加载任务信息\n\n this.listJobInfos();\n }\n});\n\n//# sourceURL=webpack:///./src/components/views/JobManager.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//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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: \"JobManager\",\n data: function data() {\n return {\n modifiedJobFormVisible: false,\n // 新建任务对象\n modifiedJobForm: {\n id: undefined,\n jobName: \"\",\n jobDescription: \"\",\n appId: this.$store.state.appInfo.id,\n jobParams: \"\",\n timeExpressionType: \"\",\n timeExpression: \"\",\n executeType: \"\",\n processorType: \"\",\n processorInfo: \"\",\n maxInstanceNum: 0,\n concurrency: 5,\n instanceTimeLimit: 0,\n instanceRetryNum: 0,\n taskRetryNum: 1,\n minCpuCores: 0,\n minMemorySpace: 0,\n minDiskSpace: 0,\n enable: true,\n designatedWorkers: \"\",\n maxWorkerCount: 0,\n notifyUserIds: []\n },\n // 任务查询请求对象\n jobQueryContent: {\n appId: this.$store.state.appInfo.id,\n index: 0,\n pageSize: 10,\n jobId: undefined,\n keyword: undefined\n },\n // 任务列表(查询结果),包含index、pageSize、totalPages、totalItems、data(List类型)\n jobInfoPageResult: {\n pageSize: 10,\n totalItems: 0,\n data: []\n },\n // 时间表达式选择类型\n timeExpressionTypeOptions: [{\n key: \"API\",\n label: \"API\"\n }, {\n key: \"CRON\",\n label: \"CRON\"\n }, {\n key: \"FIX_RATE\",\n label: this.$t('message.fixRate')\n }, {\n key: \"FIX_DELAY\",\n label: this.$t('message.fixDelay')\n }, {\n key: \"WORKFLOW\",\n label: this.$t('message.workflow')\n }],\n // 处理器类型\n processorTypeOptions: [{\n key: \"EMBEDDED_JAVA\",\n label: \"JAVA\"\n }, {\n key: \"JAVA_CONTAINER\",\n label: this.$t('message.javaContainer')\n }, {\n key: \"SHELL\",\n label: \"SHELL\"\n }, {\n key: \"PYTHON\",\n label: \"PYTHON\"\n }],\n // 执行方式类型\n executeTypeOptions: [{\n key: \"STANDALONE\",\n label: this.$t('message.standalone')\n }, {\n key: \"BROADCAST\",\n label: this.$t('message.broadcast')\n }, {\n key: \"MAP\",\n label: this.$t('message.map')\n }, {\n key: \"MAP_REDUCE\",\n label: this.$t('message.mapReduce')\n }],\n // 用户列表\n userList: []\n };\n },\n methods: {\n // 保存变更,包括新增和修改\n saveJob: function saveJob() {\n var _this = this;\n\n var that = this;\n this.axios.post(\"/job/save\", this.modifiedJobForm).then(function () {\n that.modifiedJobFormVisible = false;\n that.$message.success(_this.$t('message.success')); // 重新加载数据\n\n that.listJobInfos();\n }, function () {\n return that.modifiedJobFormVisible = false;\n });\n },\n // 列出符合当前搜索条件的任务\n listJobInfos: function listJobInfos() {\n var that = this;\n this.axios.post(\"/job/list\", this.jobQueryContent).then(function (res) {\n that.jobInfoPageResult = res;\n });\n },\n // 修改任务状态\n changeJobStatus: function changeJobStatus(data) {\n // switch 会自动更改 enable 的值\n var that = this;\n\n if (data.enable === false) {\n // 仅有,有特殊逻辑(关闭秒级任务),走单独接口\n that.axios.get(\"/job/disable?jobId=\" + data.id).then(function () {\n return that.listJobInfos();\n });\n } else {\n // 启用,则发起正常的保存操作\n this.modifiedJobForm = data;\n this.saveJob();\n }\n },\n // 新增任务,去除旧数据\n onClickNewJob: function onClickNewJob() {\n this.modifiedJobForm.id = undefined;\n this.modifiedJobForm.jobName = undefined;\n this.modifiedJobForm.jobDescription = undefined;\n this.modifiedJobForm.jobParams = undefined;\n this.modifiedJobForm.timeExpression = undefined;\n this.modifiedJobForm.timeExpressionType = undefined;\n this.modifiedJobForm.processorInfo = undefined;\n this.modifiedJobForm.processorType = undefined;\n this.modifiedJobForm.executeType = undefined;\n this.modifiedJobFormVisible = true;\n },\n // 点击 编辑按钮\n onClickModify: function onClickModify(data) {\n // 修复点击编辑后再点击新增 行数据被清空 的问题\n this.modifiedJobForm = JSON.parse(JSON.stringify(data));\n this.modifiedJobFormVisible = true;\n },\n // 点击 立即运行按钮\n onClickRun: function onClickRun(data) {\n var _this2 = this;\n\n var that = this;\n var url = \"/job/run?jobId=\" + data.id;\n this.axios.get(url).then(function () {\n return that.$message.success(_this2.$t('message.success'));\n });\n },\n // 点击 删除任务\n onClickDeleteJob: function onClickDeleteJob(data) {\n var _this3 = this;\n\n var that = this;\n var url = \"/job/delete?jobId=\" + data.id;\n this.axios.get(url).then(function () {\n that.$message.success(_this3.$t('message.success'));\n that.listJobInfos();\n });\n },\n // 点击 历史记录\n onClickRunHistory: function onClickRunHistory(data) {\n console.log(JSON.stringify(data));\n this.$router.push({\n name: 'instanceManager',\n params: {\n jobId: data.id\n }\n });\n },\n // 点击 换页\n onClickChangePage: function onClickChangePage(index) {\n // 后端从0开始,前端从1开始\n this.jobQueryContent.index = index - 1;\n this.listJobInfos();\n },\n // 点击重置按钮\n onClickReset: function onClickReset() {\n this.jobQueryContent.keyword = undefined;\n this.jobQueryContent.jobId = undefined;\n this.listJobInfos();\n },\n verifyPlaceholder: function verifyPlaceholder(processorType) {\n var res;\n\n switch (processorType) {\n case \"EMBEDDED_JAVA\":\n res = this.$t('message.javaProcessorInfoPLH');\n break;\n\n case \"JAVA_CONTAINER\":\n res = this.$t('message.containerProcessorInfoPLH');\n break;\n\n case \"SHELL\":\n res = this.$t('message.shellProcessorInfoPLH');\n break;\n\n case \"PYTHON\":\n res = this.$t('message.pythonProcessorInfoPLH');\n }\n\n return res;\n },\n // 翻译执行类型\n translateExecuteType: function translateExecuteType(executeType) {\n switch (executeType) {\n case \"STANDALONE\":\n return this.$t('message.standalone');\n\n case \"BROADCAST\":\n return this.$t('message.broadcast');\n\n case \"MAP_REDUCE\":\n return this.$t('message.mapReduce');\n\n case \"MAP\":\n return this.$t('message.map');\n\n default:\n return \"UNKNOWN\";\n }\n },\n // 翻译处理器类型\n translateProcessorType: function translateProcessorType(processorType) {\n if (processorType === \"JAVA_CONTAINER\") {\n return this.$t('message.javaContainer');\n }\n\n return processorType;\n }\n },\n mounted: function mounted() {\n // 加载用户信息\n var that = this;\n that.axios.get(\"/user/list\").then(function (res) {\n return that.userList = res;\n }); // 加载任务信息\n\n this.listJobInfos();\n }\n});\n\n//# sourceURL=webpack:///./src/components/views/JobManager.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: \"job_manager\" } },\n [\n _c(\n \"el-row\",\n { attrs: { gutter: 20 } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 20 } },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.jobQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.jobId\") },\n model: {\n value: _vm.jobQueryContent.jobId,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"jobId\", $$v)\n },\n expression: \"jobQueryContent.jobId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.keyword\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.keyword\") },\n model: {\n value: _vm.jobQueryContent.keyword,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"keyword\", $$v)\n },\n expression: \"jobQueryContent.keyword\"\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.listJobInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickReset }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\"el-col\", { attrs: { span: 4 } }, [\n _c(\n \"div\",\n { staticStyle: { float: \"right\", \"padding-right\": \"10px\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.onClickNewJob }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.newJob\")))]\n )\n ],\n 1\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: { data: _vm.jobInfoPageResult.data }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"id\",\n label: _vm.$t(\"message.jobId\"),\n width: \"80\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"jobName\", label: _vm.$t(\"message.jobName\") }\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.scheduleInfo\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(scope.row.timeExpressionType) +\n \" \" +\n _vm._s(scope.row.timeExpression) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.executeType\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(\n _vm.translateExecuteType(scope.row.executeType)\n ) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.processorType\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(\n _vm.translateProcessorType(\n scope.row.processorType\n )\n ) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.status\"), width: \"80\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\"el-switch\", {\n attrs: {\n \"active-color\": \"#13ce66\",\n \"inactive-color\": \"#ff4949\"\n },\n on: {\n change: function($event) {\n return _vm.changeJobStatus(scope.row)\n }\n },\n model: {\n value: scope.row.enable,\n callback: function($$v) {\n _vm.$set(scope.row, \"enable\", $$v)\n },\n expression: \"scope.row.enable\"\n }\n })\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.operation\"), width: \"300\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickModify(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.edit\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickRun(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.run\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\", type: \"danger\" },\n on: {\n click: function($event) {\n return _vm.onClickDeleteJob(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.delete\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-pagination\", {\n attrs: {\n layout: \"prev, pager, next\",\n total: this.jobInfoPageResult.totalItems,\n \"page-size\": this.jobInfoPageResult.pageSize,\n \"hide-on-single-page\": true\n },\n on: { \"current-change\": _vm.onClickChangePage }\n })\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.modifiedJobFormVisible, width: \"60%\" },\n on: {\n \"update:visible\": function($event) {\n _vm.modifiedJobFormVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n { attrs: { model: _vm.modifiedJobForm, \"label-width\": \"120px\" } },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.modifiedJobForm.jobName,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"jobName\", $$v)\n },\n expression: \"modifiedJobForm.jobName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobDescription\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.modifiedJobForm.jobDescription,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"jobDescription\", $$v)\n },\n expression: \"modifiedJobForm.jobDescription\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobParams\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.modifiedJobForm.jobParams,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"jobParams\", $$v)\n },\n expression: \"modifiedJobForm.jobParams\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.scheduleInfo\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\n \"message.timeExpressionType\"\n )\n },\n model: {\n value: _vm.modifiedJobForm.timeExpressionType,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"timeExpressionType\",\n $$v\n )\n },\n expression: \"modifiedJobForm.timeExpressionType\"\n }\n },\n _vm._l(_vm.timeExpressionTypeOptions, function(\n item\n ) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\n \"message.timeExpressionPlaceHolder\"\n )\n },\n model: {\n value: _vm.modifiedJobForm.timeExpression,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"timeExpression\",\n $$v\n )\n },\n expression: \"modifiedJobForm.timeExpression\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 4 } },\n [\n _c(\n \"el-link\",\n {\n attrs: {\n href: \"https://cron.qqe2.com/\",\n type: \"success\",\n target: \"_blank\"\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.onlineCronTool\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.executeConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 5 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\"message.executeType\")\n },\n model: {\n value: _vm.modifiedJobForm.executeType,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"executeType\",\n $$v\n )\n },\n expression: \"modifiedJobForm.executeType\"\n }\n },\n _vm._l(_vm.executeTypeOptions, function(item) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\"message.processorType\")\n },\n model: {\n value: _vm.modifiedJobForm.processorType,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"processorType\",\n $$v\n )\n },\n expression: \"modifiedJobForm.processorType\"\n }\n },\n _vm._l(_vm.processorTypeOptions, function(item) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 13 } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.verifyPlaceholder(\n _vm.modifiedJobForm.processorType\n )\n },\n model: {\n value: _vm.modifiedJobForm.processorInfo,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"processorInfo\",\n $$v\n )\n },\n expression: \"modifiedJobForm.processorInfo\"\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.runtimeConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.maxInstanceNum\")\n },\n model: {\n value: _vm.modifiedJobForm.maxInstanceNum,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"maxInstanceNum\",\n $$v\n )\n },\n expression: \"modifiedJobForm.maxInstanceNum\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.maxInstanceNum\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.threadConcurrency\")\n },\n model: {\n value: _vm.modifiedJobForm.concurrency,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"concurrency\",\n $$v\n )\n },\n expression: \"modifiedJobForm.concurrency\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(\n _vm._s(_vm.$t(\"message.threadConcurrency\"))\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: { placeholder: _vm.$t(\"message.timeout\") },\n model: {\n value: _vm.modifiedJobForm.instanceTimeLimit,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"instanceTimeLimit\",\n $$v\n )\n },\n expression: \"modifiedJobForm.instanceTimeLimit\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.timeout\")))\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.retryConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.taskRetryTimes\")\n },\n model: {\n value: _vm.modifiedJobForm.instanceRetryNum,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"instanceRetryNum\",\n $$v\n )\n },\n expression: \"modifiedJobForm.instanceRetryNum\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.taskRetryTimes\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.subTaskRetryTimes\")\n },\n model: {\n value: _vm.modifiedJobForm.taskRetryNum,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"taskRetryNum\",\n $$v\n )\n },\n expression: \"modifiedJobForm.taskRetryNum\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(\n _vm._s(_vm.$t(\"message.subTaskRetryTimes\"))\n )\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.workerConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: { placeholder: _vm.$t(\"message.minCPU\") },\n model: {\n value: _vm.modifiedJobForm.minCpuCores,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"minCpuCores\",\n $$v\n )\n },\n expression: \"modifiedJobForm.minCpuCores\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.minCPU\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.minMemory\")\n },\n model: {\n value: _vm.modifiedJobForm.minMemorySpace,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"minMemorySpace\",\n $$v\n )\n },\n expression: \"modifiedJobForm.minMemorySpace\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.minMemory\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: { placeholder: _vm.$t(\"message.minDisk\") },\n model: {\n value: _vm.modifiedJobForm.minDiskSpace,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"minDiskSpace\",\n $$v\n )\n },\n expression: \"modifiedJobForm.minDiskSpace\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.minDisk\")))\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.clusterConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 16 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\n \"message.designatedWorkerAddressPLH\"\n )\n },\n model: {\n value: _vm.modifiedJobForm.designatedWorkers,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"designatedWorkers\",\n $$v\n )\n },\n expression: \"modifiedJobForm.designatedWorkers\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(\n _vm._s(\n _vm.$t(\"message.designatedWorkerAddress\")\n )\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.maxWorkerNumPLH\")\n },\n model: {\n value: _vm.modifiedJobForm.maxWorkerCount,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"maxWorkerCount\",\n $$v\n )\n },\n expression: \"modifiedJobForm.maxWorkerCount\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.maxWorkerNum\")))\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.alarmConfig\") } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n multiple: \"\",\n filterable: \"\",\n placeholder: _vm.$t(\"message.alarmSelectorPLH\")\n },\n model: {\n value: _vm.modifiedJobForm.notifyUserIds,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"notifyUserIds\", $$v)\n },\n expression: \"modifiedJobForm.notifyUserIds\"\n }\n },\n _vm._l(_vm.userList, function(user) {\n return _c(\"el-option\", {\n key: user.id,\n attrs: { label: user.username, value: user.id }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.saveJob } },\n [_vm._v(_vm._s(_vm.$t(\"message.save\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.modifiedJobFormVisible = 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}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/views/JobManager.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: \"job_manager\" } },\n [\n _c(\n \"el-row\",\n { attrs: { gutter: 20 } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 20 } },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.jobQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.jobId\") },\n model: {\n value: _vm.jobQueryContent.jobId,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"jobId\", $$v)\n },\n expression: \"jobQueryContent.jobId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.keyword\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.keyword\") },\n model: {\n value: _vm.jobQueryContent.keyword,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"keyword\", $$v)\n },\n expression: \"jobQueryContent.keyword\"\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.listJobInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickReset }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\"el-col\", { attrs: { span: 4 } }, [\n _c(\n \"div\",\n { staticStyle: { float: \"right\", \"padding-right\": \"10px\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.onClickNewJob }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.newJob\")))]\n )\n ],\n 1\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: { data: _vm.jobInfoPageResult.data }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"id\",\n label: _vm.$t(\"message.jobId\"),\n width: \"80\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"jobName\", label: _vm.$t(\"message.jobName\") }\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.scheduleInfo\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(scope.row.timeExpressionType) +\n \" \" +\n _vm._s(scope.row.timeExpression) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.executeType\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(\n _vm.translateExecuteType(scope.row.executeType)\n ) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.processorType\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(\n _vm.translateProcessorType(\n scope.row.processorType\n )\n ) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.status\"), width: \"80\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\"el-switch\", {\n attrs: {\n \"active-color\": \"#13ce66\",\n \"inactive-color\": \"#ff4949\"\n },\n on: {\n change: function($event) {\n return _vm.changeJobStatus(scope.row)\n }\n },\n model: {\n value: scope.row.enable,\n callback: function($$v) {\n _vm.$set(scope.row, \"enable\", $$v)\n },\n expression: \"scope.row.enable\"\n }\n })\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.operation\"), width: \"150\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"text\" },\n on: {\n click: function($event) {\n return _vm.onClickModify(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.edit\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"text\" },\n on: {\n click: function($event) {\n return _vm.onClickRun(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.run\")))]\n ),\n _c(\n \"el-dropdown\",\n { attrs: { trigger: \"click\" } },\n [\n _c(\n \"el-button\",\n { attrs: { size: \"mini\", type: \"text\" } },\n [_vm._v(_vm._s(_vm.$t(\"message.more\")))]\n ),\n _c(\n \"el-dropdown-menu\",\n { attrs: { slot: \"dropdown\" }, slot: \"dropdown\" },\n [\n _c(\n \"el-dropdown-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"text\" },\n on: {\n click: function($event) {\n return _vm.onClickRunHistory(\n scope.row\n )\n }\n }\n },\n [\n _vm._v(\n _vm._s(_vm.$t(\"message.runHistory\"))\n )\n ]\n )\n ],\n 1\n ),\n _c(\n \"el-dropdown-item\",\n [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"text\" },\n on: {\n click: function($event) {\n return _vm.onClickDeleteJob(\n scope.row\n )\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.delete\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-pagination\", {\n attrs: {\n layout: \"prev, pager, next\",\n total: this.jobInfoPageResult.totalItems,\n \"page-size\": this.jobInfoPageResult.pageSize,\n \"hide-on-single-page\": true\n },\n on: { \"current-change\": _vm.onClickChangePage }\n })\n ],\n 1\n ),\n _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.modifiedJobFormVisible, width: \"60%\" },\n on: {\n \"update:visible\": function($event) {\n _vm.modifiedJobFormVisible = $event\n }\n }\n },\n [\n _c(\n \"el-form\",\n { attrs: { model: _vm.modifiedJobForm, \"label-width\": \"120px\" } },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.modifiedJobForm.jobName,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"jobName\", $$v)\n },\n expression: \"modifiedJobForm.jobName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobDescription\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.modifiedJobForm.jobDescription,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"jobDescription\", $$v)\n },\n expression: \"modifiedJobForm.jobDescription\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobParams\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.modifiedJobForm.jobParams,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"jobParams\", $$v)\n },\n expression: \"modifiedJobForm.jobParams\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.scheduleInfo\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\n \"message.timeExpressionType\"\n )\n },\n model: {\n value: _vm.modifiedJobForm.timeExpressionType,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"timeExpressionType\",\n $$v\n )\n },\n expression: \"modifiedJobForm.timeExpressionType\"\n }\n },\n _vm._l(_vm.timeExpressionTypeOptions, function(\n item\n ) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\n \"message.timeExpressionPlaceHolder\"\n )\n },\n model: {\n value: _vm.modifiedJobForm.timeExpression,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"timeExpression\",\n $$v\n )\n },\n expression: \"modifiedJobForm.timeExpression\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 4 } },\n [\n _c(\n \"el-link\",\n {\n attrs: {\n href: \"https://www.bejson.com/othertools/cron/\",\n type: \"success\",\n target: \"_blank\"\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.onlineCronTool\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.executeConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 5 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\"message.executeType\")\n },\n model: {\n value: _vm.modifiedJobForm.executeType,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"executeType\",\n $$v\n )\n },\n expression: \"modifiedJobForm.executeType\"\n }\n },\n _vm._l(_vm.executeTypeOptions, function(item) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\"message.processorType\")\n },\n model: {\n value: _vm.modifiedJobForm.processorType,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"processorType\",\n $$v\n )\n },\n expression: \"modifiedJobForm.processorType\"\n }\n },\n _vm._l(_vm.processorTypeOptions, function(item) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 13 } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.verifyPlaceholder(\n _vm.modifiedJobForm.processorType\n )\n },\n model: {\n value: _vm.modifiedJobForm.processorInfo,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"processorInfo\",\n $$v\n )\n },\n expression: \"modifiedJobForm.processorInfo\"\n }\n })\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.runtimeConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.maxInstanceNum\")\n },\n model: {\n value: _vm.modifiedJobForm.maxInstanceNum,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"maxInstanceNum\",\n $$v\n )\n },\n expression: \"modifiedJobForm.maxInstanceNum\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.maxInstanceNum\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.threadConcurrency\")\n },\n model: {\n value: _vm.modifiedJobForm.concurrency,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"concurrency\",\n $$v\n )\n },\n expression: \"modifiedJobForm.concurrency\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(\n _vm._s(_vm.$t(\"message.threadConcurrency\"))\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: { placeholder: _vm.$t(\"message.timeout\") },\n model: {\n value: _vm.modifiedJobForm.instanceTimeLimit,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"instanceTimeLimit\",\n $$v\n )\n },\n expression: \"modifiedJobForm.instanceTimeLimit\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.timeout\")))\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.retryConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.taskRetryTimes\")\n },\n model: {\n value: _vm.modifiedJobForm.instanceRetryNum,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"instanceRetryNum\",\n $$v\n )\n },\n expression: \"modifiedJobForm.instanceRetryNum\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.taskRetryTimes\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.subTaskRetryTimes\")\n },\n model: {\n value: _vm.modifiedJobForm.taskRetryNum,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"taskRetryNum\",\n $$v\n )\n },\n expression: \"modifiedJobForm.taskRetryNum\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(\n _vm._s(_vm.$t(\"message.subTaskRetryTimes\"))\n )\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.workerConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: { placeholder: _vm.$t(\"message.minCPU\") },\n model: {\n value: _vm.modifiedJobForm.minCpuCores,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"minCpuCores\",\n $$v\n )\n },\n expression: \"modifiedJobForm.minCpuCores\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.minCPU\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.minMemory\")\n },\n model: {\n value: _vm.modifiedJobForm.minMemorySpace,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"minMemorySpace\",\n $$v\n )\n },\n expression: \"modifiedJobForm.minMemorySpace\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.minMemory\")))\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: { placeholder: _vm.$t(\"message.minDisk\") },\n model: {\n value: _vm.modifiedJobForm.minDiskSpace,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"minDiskSpace\",\n $$v\n )\n },\n expression: \"modifiedJobForm.minDiskSpace\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.minDisk\")))\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.clusterConfig\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 16 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\n \"message.designatedWorkerAddressPLH\"\n )\n },\n model: {\n value: _vm.modifiedJobForm.designatedWorkers,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"designatedWorkers\",\n $$v\n )\n },\n expression: \"modifiedJobForm.designatedWorkers\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(\n _vm._s(\n _vm.$t(\"message.designatedWorkerAddress\")\n )\n )\n ])\n ],\n 2\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 8 } },\n [\n _c(\n \"el-input\",\n {\n staticClass: \"ruleContent\",\n attrs: {\n placeholder: _vm.$t(\"message.maxWorkerNumPLH\")\n },\n model: {\n value: _vm.modifiedJobForm.maxWorkerCount,\n callback: function($$v) {\n _vm.$set(\n _vm.modifiedJobForm,\n \"maxWorkerCount\",\n $$v\n )\n },\n expression: \"modifiedJobForm.maxWorkerCount\"\n }\n },\n [\n _c(\"template\", { slot: \"prepend\" }, [\n _vm._v(_vm._s(_vm.$t(\"message.maxWorkerNum\")))\n ])\n ],\n 2\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.alarmConfig\") } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n multiple: \"\",\n filterable: \"\",\n placeholder: _vm.$t(\"message.alarmSelectorPLH\")\n },\n model: {\n value: _vm.modifiedJobForm.notifyUserIds,\n callback: function($$v) {\n _vm.$set(_vm.modifiedJobForm, \"notifyUserIds\", $$v)\n },\n expression: \"modifiedJobForm.notifyUserIds\"\n }\n },\n _vm._l(_vm.userList, function(user) {\n return _c(\"el-option\", {\n key: user.id,\n attrs: { label: user.username, value: user.id }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.saveJob } },\n [_vm._v(_vm._s(_vm.$t(\"message.save\")))]\n ),\n _c(\n \"el-button\",\n {\n on: {\n click: function($event) {\n _vm.modifiedJobFormVisible = 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}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/views/JobManager.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");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/11.js b/powerjob-server/src/main/resources/static/js/11.js
index 1a5fa90e..bd112e12 100644
--- a/powerjob-server/src/main/resources/static/js/11.js
+++ b/powerjob-server/src/main/resources/static/js/11.js
@@ -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: \"workflow_manager\" } },\n [\n _c(\n \"el-row\",\n { attrs: { gutter: 20 } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 20 } },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.workflowQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.wfId\") },\n model: {\n value: _vm.workflowQueryContent.workflowId,\n callback: function($$v) {\n _vm.$set(\n _vm.workflowQueryContent,\n \"workflowId\",\n $$v\n )\n },\n expression: \"workflowQueryContent.workflowId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.keyword\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.keyword\") },\n model: {\n value: _vm.workflowQueryContent.keyword,\n callback: function($$v) {\n _vm.$set(_vm.workflowQueryContent, \"keyword\", $$v)\n },\n expression: \"workflowQueryContent.keyword\"\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.listWorkflow }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickReset }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\"el-col\", { attrs: { span: 4 } }, [\n _c(\n \"div\",\n { staticStyle: { float: \"right\", \"padding-right\": \"10px\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.onClickNewWorkflow }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.newWorkflow\")))]\n )\n ],\n 1\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: { data: _vm.workflowPageResult.data }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"id\",\n label: _vm.$t(\"message.wfId\"),\n width: \"120\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"wfName\", label: _vm.$t(\"message.wfName\") }\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.scheduleInfo\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(scope.row.timeExpressionType) +\n \" \" +\n _vm._s(scope.row.timeExpression) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.status\"), width: \"80\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\"el-switch\", {\n attrs: {\n \"active-color\": \"#13ce66\",\n \"inactive-color\": \"#ff4949\"\n },\n on: {\n change: function($event) {\n return _vm.switchWorkflow(scope.row)\n }\n },\n model: {\n value: scope.row.enable,\n callback: function($$v) {\n _vm.$set(scope.row, \"enable\", $$v)\n },\n expression: \"scope.row.enable\"\n }\n })\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.operation\"), width: \"300\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickModifyWorkflow(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.edit\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickRunWorkflow(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.run\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\", type: \"danger\" },\n on: {\n click: function($event) {\n return _vm.onClickDeleteWorkflow(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.delete\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-pagination\", {\n attrs: {\n layout: \"prev, pager, next\",\n total: this.workflowPageResult.totalItems,\n \"page-size\": this.workflowPageResult.pageSize,\n \"hide-on-single-page\": true\n },\n on: { \"current-change\": _vm.onClickChangePage }\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/views/WorkflowManager.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: \"workflow_manager\" } },\n [\n _c(\n \"el-row\",\n { attrs: { gutter: 20 } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 20 } },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.workflowQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.wfId\") },\n model: {\n value: _vm.workflowQueryContent.workflowId,\n callback: function($$v) {\n _vm.$set(\n _vm.workflowQueryContent,\n \"workflowId\",\n $$v\n )\n },\n expression: \"workflowQueryContent.workflowId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.keyword\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.keyword\") },\n model: {\n value: _vm.workflowQueryContent.keyword,\n callback: function($$v) {\n _vm.$set(_vm.workflowQueryContent, \"keyword\", $$v)\n },\n expression: \"workflowQueryContent.keyword\"\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.listWorkflow }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickReset }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\"el-col\", { attrs: { span: 4 } }, [\n _c(\n \"div\",\n { staticStyle: { float: \"right\", \"padding-right\": \"10px\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.onClickNewWorkflow }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.newWorkflow\")))]\n )\n ],\n 1\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: { data: _vm.workflowPageResult.data }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"id\",\n label: _vm.$t(\"message.wfId\"),\n width: \"120\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"wfName\", label: _vm.$t(\"message.wfName\") }\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.scheduleInfo\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" +\n _vm._s(scope.row.timeExpressionType) +\n \" \" +\n _vm._s(scope.row.timeExpression) +\n \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.status\"), width: \"80\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\"el-switch\", {\n attrs: {\n \"active-color\": \"#13ce66\",\n \"inactive-color\": \"#ff4949\"\n },\n on: {\n change: function($event) {\n return _vm.switchWorkflow(scope.row)\n }\n },\n model: {\n value: scope.row.enable,\n callback: function($$v) {\n _vm.$set(scope.row, \"enable\", $$v)\n },\n expression: \"scope.row.enable\"\n }\n })\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.operation\"), width: \"300\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\" },\n on: {\n click: function($event) {\n return _vm.onClickModifyWorkflow(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.edit\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\" },\n on: {\n click: function($event) {\n return _vm.onClickRunWorkflow(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.run\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"danger\" },\n on: {\n click: function($event) {\n return _vm.onClickDeleteWorkflow(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.delete\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-pagination\", {\n attrs: {\n layout: \"prev, pager, next\",\n total: this.workflowPageResult.totalItems,\n \"page-size\": this.workflowPageResult.pageSize,\n \"hide-on-single-page\": true\n },\n on: { \"current-change\": _vm.onClickChangePage }\n })\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/components/views/WorkflowManager.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");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/4.js b/powerjob-server/src/main/resources/static/js/4.js
index c40c81b4..6fd89a21 100644
--- a/powerjob-server/src/main/resources/static/js/4.js
+++ b/powerjob-server/src/main/resources/static/js/4.js
@@ -20,7 +20,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core
/***/ (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 [\n _c(\n \"el-row\",\n { staticStyle: { margin: \"20px\" } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 1 } },\n [\n _c(\n \"el-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.back } },\n [_vm._v(_vm._s(_vm.$t(\"message.back\")))]\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 1, offset: 22 } },\n [\n _c(\n \"el-button\",\n { attrs: { type: \"success\" }, on: { click: _vm.saveWorkflow } },\n [_vm._v(_vm._s(_vm.$t(\"message.save\")))]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-form\",\n { ref: \"form\", attrs: { model: _vm.workflowInfo } },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.workflowInfo.wfName,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"wfName\", $$v)\n },\n expression: \"workflowInfo.wfName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfDescription\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.workflowInfo.wfDescription,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"wfDescription\", $$v)\n },\n expression: \"workflowInfo.wfDescription\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.scheduleInfo\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\n \"message.timeExpressionType\"\n )\n },\n model: {\n value: _vm.workflowInfo.timeExpressionType,\n callback: function($$v) {\n _vm.$set(\n _vm.workflowInfo,\n \"timeExpressionType\",\n $$v\n )\n },\n expression: \"workflowInfo.timeExpressionType\"\n }\n },\n _vm._l(_vm.timeExpressionTypeOptions, function(\n item\n ) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\"message.wfTimeExpressionPLH\")\n },\n model: {\n value: _vm.workflowInfo.timeExpression,\n callback: function($$v) {\n _vm.$set(\n _vm.workflowInfo,\n \"timeExpression\",\n $$v\n )\n },\n expression: \"workflowInfo.timeExpression\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 4 } },\n [\n _c(\n \"el-link\",\n {\n attrs: {\n href: \"https://cron.qqe2.com/\",\n type: \"success\",\n target: \"_blank\"\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.onlineCronTool\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.maxInstanceNum\") } },\n [\n _c(\"el-input-number\", {\n model: {\n value: _vm.workflowInfo.maxWfInstanceNum,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"maxWfInstanceNum\", $$v)\n },\n expression: \"workflowInfo.maxWfInstanceNum\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.alarmConfig\") } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n multiple: \"\",\n filterable: \"\",\n placeholder: _vm.$t(\"message.alarmSelectorPLH\")\n },\n model: {\n value: _vm.workflowInfo.notifyUserIds,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"notifyUserIds\", $$v)\n },\n expression: \"workflowInfo.notifyUserIds\"\n }\n },\n _vm._l(_vm.userList, function(user) {\n return _c(\"el-option\", {\n key: user.id,\n attrs: { label: user.username, value: user.id }\n })\n }),\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-row\",\n [\n _c(\"el-button\", { on: { click: _vm.onClickImportNode } }, [\n _vm._v(_vm._s(_vm.$t(\"message.importJob\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickRemoveNode } }, [\n _vm._v(_vm._s(_vm.$t(\"message.deleteJob\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickAddFrom } }, [\n _vm._v(_vm._s(_vm.$t(\"message.newStartPoint\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickAddTo } }, [\n _vm._v(_vm._s(_vm.$t(\"message.newEndPoint\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickRemoveEdge } }, [\n _vm._v(_vm._s(_vm.$t(\"message.deleteEdge\")))\n ])\n ],\n 1\n ),\n _c(\"div\", [\n _c(\n \"svg\",\n { attrs: { width: \"80%\", height: \"1000px\", id: \"svgCanvas\" } },\n [_c(\"g\"), _c(\"rect\")]\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-drawer\",\n {\n attrs: {\n title: _vm.$t(\"message.importJobTitle\"),\n visible: _vm.importDrawerVisible,\n direction: \"rtl\",\n size: \"50%\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.importDrawerVisible = $event\n }\n }\n },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.jobQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.jobId\") },\n model: {\n value: _vm.jobQueryContent.jobId,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"jobId\", $$v)\n },\n expression: \"jobQueryContent.jobId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.keyword\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.keyword\") },\n model: {\n value: _vm.jobQueryContent.keyword,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"keyword\", $$v)\n },\n expression: \"jobQueryContent.keyword\"\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.listJobInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickReset }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-table\",\n { attrs: { data: _vm.jobInfoPageResult.data } },\n [\n _c(\"el-table-column\", {\n attrs: { property: \"id\", label: _vm.$t(\"message.jobId\") }\n }),\n _c(\"el-table-column\", {\n attrs: { property: \"jobName\", label: _vm.$t(\"message.jobName\") }\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.operation\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.importNode(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.import\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-pagination\", {\n attrs: {\n layout: \"prev, pager, next\",\n total: this.jobInfoPageResult.totalItems,\n \"page-size\": this.jobInfoPageResult.pageSize\n },\n on: { \"current-change\": _vm.onClickChangePage }\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/dag/WorkflowEditor.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 [\n _c(\n \"el-row\",\n { staticStyle: { margin: \"20px\" } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 1 } },\n [\n _c(\n \"el-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.back } },\n [_vm._v(_vm._s(_vm.$t(\"message.back\")))]\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 1, offset: 22 } },\n [\n _c(\n \"el-button\",\n { attrs: { type: \"success\" }, on: { click: _vm.saveWorkflow } },\n [_vm._v(_vm._s(_vm.$t(\"message.save\")))]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-form\",\n { ref: \"form\", attrs: { model: _vm.workflowInfo } },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfName\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.workflowInfo.wfName,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"wfName\", $$v)\n },\n expression: \"workflowInfo.wfName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfDescription\") } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.workflowInfo.wfDescription,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"wfDescription\", $$v)\n },\n expression: \"workflowInfo.wfDescription\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.scheduleInfo\") } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 6 } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n placeholder: _vm.$t(\n \"message.timeExpressionType\"\n )\n },\n model: {\n value: _vm.workflowInfo.timeExpressionType,\n callback: function($$v) {\n _vm.$set(\n _vm.workflowInfo,\n \"timeExpressionType\",\n $$v\n )\n },\n expression: \"workflowInfo.timeExpressionType\"\n }\n },\n _vm._l(_vm.timeExpressionTypeOptions, function(\n item\n ) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 12 } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\"message.wfTimeExpressionPLH\")\n },\n model: {\n value: _vm.workflowInfo.timeExpression,\n callback: function($$v) {\n _vm.$set(\n _vm.workflowInfo,\n \"timeExpression\",\n $$v\n )\n },\n expression: \"workflowInfo.timeExpression\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-col\",\n { attrs: { span: 4 } },\n [\n _c(\n \"el-link\",\n {\n attrs: {\n href: \"https://www.bejson.com/othertools/cron/\",\n type: \"success\",\n target: \"_blank\"\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.onlineCronTool\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.maxInstanceNum\") } },\n [\n _c(\"el-input-number\", {\n model: {\n value: _vm.workflowInfo.maxWfInstanceNum,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"maxWfInstanceNum\", $$v)\n },\n expression: \"workflowInfo.maxWfInstanceNum\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.alarmConfig\") } },\n [\n _c(\n \"el-select\",\n {\n attrs: {\n multiple: \"\",\n filterable: \"\",\n placeholder: _vm.$t(\"message.alarmSelectorPLH\")\n },\n model: {\n value: _vm.workflowInfo.notifyUserIds,\n callback: function($$v) {\n _vm.$set(_vm.workflowInfo, \"notifyUserIds\", $$v)\n },\n expression: \"workflowInfo.notifyUserIds\"\n }\n },\n _vm._l(_vm.userList, function(user) {\n return _c(\"el-option\", {\n key: user.id,\n attrs: { label: user.username, value: user.id }\n })\n }),\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-row\",\n [\n _c(\"el-button\", { on: { click: _vm.onClickImportNode } }, [\n _vm._v(_vm._s(_vm.$t(\"message.importJob\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickRemoveNode } }, [\n _vm._v(_vm._s(_vm.$t(\"message.deleteJob\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickAddFrom } }, [\n _vm._v(_vm._s(_vm.$t(\"message.newStartPoint\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickAddTo } }, [\n _vm._v(_vm._s(_vm.$t(\"message.newEndPoint\")))\n ]),\n _c(\"el-button\", { on: { click: _vm.onClickRemoveEdge } }, [\n _vm._v(_vm._s(_vm.$t(\"message.deleteEdge\")))\n ])\n ],\n 1\n ),\n _c(\"div\", [\n _c(\n \"svg\",\n { attrs: { width: \"80%\", height: \"1000px\", id: \"svgCanvas\" } },\n [_c(\"g\"), _c(\"rect\")]\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-drawer\",\n {\n attrs: {\n title: _vm.$t(\"message.importJobTitle\"),\n visible: _vm.importDrawerVisible,\n direction: \"rtl\",\n size: \"50%\"\n },\n on: {\n \"update:visible\": function($event) {\n _vm.importDrawerVisible = $event\n }\n }\n },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.jobQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.jobId\") },\n model: {\n value: _vm.jobQueryContent.jobId,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"jobId\", $$v)\n },\n expression: \"jobQueryContent.jobId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.keyword\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.keyword\") },\n model: {\n value: _vm.jobQueryContent.keyword,\n callback: function($$v) {\n _vm.$set(_vm.jobQueryContent, \"keyword\", $$v)\n },\n expression: \"jobQueryContent.keyword\"\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.listJobInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickReset }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-table\",\n { attrs: { data: _vm.jobInfoPageResult.data } },\n [\n _c(\"el-table-column\", {\n attrs: { property: \"id\", label: _vm.$t(\"message.jobId\") }\n }),\n _c(\"el-table-column\", {\n attrs: { property: \"jobName\", label: _vm.$t(\"message.jobName\") }\n }),\n _c(\"el-table-column\", {\n attrs: { label: _vm.$t(\"message.operation\") },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.importNode(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.import\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-pagination\", {\n attrs: {\n layout: \"prev, pager, next\",\n total: this.jobInfoPageResult.totalItems,\n \"page-size\": this.jobInfoPageResult.pageSize\n },\n on: { \"current-change\": _vm.onClickChangePage }\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/dag/WorkflowEditor.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");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/5.js b/powerjob-server/src/main/resources/static/js/5.js
index 7b569ad2..5cb80426 100644
--- a/powerjob-server/src/main/resources/static/js/5.js
+++ b/powerjob-server/src/main/resources/static/js/5.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//\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: \"UNKNOWN\",\n timezone: \"UNKNOWN\"\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 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 // let localTime=new Date().getTime();\n // let serverTime = res.serverTime;\n // console.log(\"localTime: %o, serverTime: %o\", localTime, serverTime);\n //\n // let offset = localTime - serverTime;\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//\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: \"UNKNOWN\",\n timezone: \"UNKNOWN\"\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 default:\n return 'error-row';\n }\n }\n },\n mounted: function mounted() {\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 // let localTime=new Date().getTime();\n // let serverTime = res.serverTime;\n // console.log(\"localTime: %o, serverTime: %o\", localTime, serverTime);\n //\n // let offset = localTime - serverTime;\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");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/8.js b/powerjob-server/src/main/resources/static/js/8.js
index 5fa20e94..fab33077 100644
--- a/powerjob-server/src/main/resources/static/js/8.js
+++ b/powerjob-server/src/main/resources/static/js/8.js
@@ -8,7 +8,7 @@
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _common_InstanceDetail__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/InstanceDetail */ \"./src/components/common/InstanceDetail.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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: \"InstanceManager\",\n components: {\n InstanceDetail: _common_InstanceDetail__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n data: function data() {\n return {\n // 实例查询对象\n instanceQueryContent: {\n appId: this.$store.state.appInfo.id,\n index: 0,\n pageSize: 10,\n instanceId: undefined,\n wfInstanceId: undefined,\n status: \"\",\n jobId: undefined,\n type: \"NORMAL\"\n },\n // 实例查询结果\n instancePageResult: {\n pageSize: 10,\n totalItems: 0,\n data: []\n },\n // 详细信息弹出框是否可见\n instanceDetailVisible: false,\n // 日志查询对象\n logQueryContent: {\n instanceId: undefined,\n index: 0\n },\n // 日志对象\n paginableInstanceLog: {\n index: 0,\n totalPages: 0,\n data: \"\"\n },\n // 日志弹出框是否可见\n instanceLogVisible: false,\n currentInstanceId: undefined,\n // 任务实例状态选择\n instanceStatusOptions: [{\n key: \"\",\n label: this.$t('message.all')\n }, {\n key: \"WAITING_DISPATCH\",\n label: this.$t('message.waitingDispatch')\n }, {\n key: \"WAITING_WORKER_RECEIVE\",\n label: this.$t('message.waitingWorkerReceive')\n }, {\n key: \"RUNNING\",\n label: this.$t('message.running')\n }, {\n key: \"FAILED\",\n label: this.$t('message.failed')\n }, {\n key: \"SUCCEED\",\n label: this.$t('message.success')\n }, {\n key: \"CANCELED\",\n label: this.$t('message.canceled')\n }, {\n key: \"STOPPED\",\n label: this.$t('message.stopped')\n }]\n };\n },\n methods: {\n // 查询任务实例信息\n listInstanceInfos: function listInstanceInfos() {\n var that = this;\n that.axios.post(\"/instance/list\", that.instanceQueryContent).then(function (res) {\n that.instancePageResult = res;\n });\n },\n // 点击重置按钮\n onClickRest: function onClickRest() {\n this.instanceQueryContent.jobId = undefined;\n this.instanceQueryContent.instanceId = undefined;\n this.instanceQueryContent.wfInstanceId = undefined;\n this.instanceQueryContent.status = \"\";\n this.listInstanceInfos();\n },\n // 点击查询详情\n onClickShowDetail: function onClickShowDetail(data) {\n this.instanceDetailVisible = true;\n this.currentInstanceId = data.instanceId;\n },\n // 点击停止实例\n onClickStop: function onClickStop(data) {\n var _this = this;\n\n var that = this;\n var url = \"/instance/stop?instanceId=\" + data.instanceId;\n this.axios.get(url).then(function () {\n that.$message.success(_this.$t('message.success')); // 重新加载列表\n\n that.listInstanceInfos();\n });\n },\n // 换页\n onClickChangeInstancePage: function onClickChangeInstancePage(index) {\n // 后端从0开始,前端从1开始\n this.instanceQueryContent.index = index - 1;\n this.listInstanceInfos();\n },\n instanceTableRowClassName: function instanceTableRowClassName(_ref) {\n var row = _ref.row;\n\n switch (row.status) {\n // 失败\n case 4:\n return 'error-row';\n // 成功\n\n case 5:\n return 'success-row';\n\n case 9:\n case 10:\n return 'warning-row';\n }\n },\n // 查看日志\n queryLog: function queryLog() {\n var that = this;\n var url = \"/instance/log?instanceId=\" + this.logQueryContent.instanceId + \"&index=\" + this.logQueryContent.index;\n this.axios.get(url).then(function (res) {\n that.paginableInstanceLog = res;\n that.instanceLogVisible = true;\n });\n },\n // 查看在线日志\n onClickShowLog: function onClickShowLog(data) {\n this.logQueryContent.instanceId = data.instanceId;\n this.logQueryContent.index = 0;\n this.queryLog();\n },\n // 查看其它页的在线日志\n onClickChangeLogPage: function onClickChangeLogPage(index) {\n this.logQueryContent.index = index - 1;\n this.queryLog();\n },\n // 下载日志\n onclickDownloadLog: function onclickDownloadLog() {\n var url = \"/instance/downloadLogUrl?instanceId=\" + this.logQueryContent.instanceId;\n this.axios.get(url).then(function (res) {\n return window.open(res);\n });\n },\n // 获取状态\n fetchStatus: function fetchStatus(s) {\n return this.common.translateInstanceStatus(s);\n }\n },\n mounted: function mounted() {\n this.listInstanceInfos();\n }\n});\n\n//# sourceURL=webpack:///./src/components/views/InstanceManager.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 _common_InstanceDetail__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/InstanceDetail */ \"./src/components/common/InstanceDetail.vue\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\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: \"InstanceManager\",\n components: {\n InstanceDetail: _common_InstanceDetail__WEBPACK_IMPORTED_MODULE_0__[\"default\"]\n },\n data: function data() {\n return {\n // 实例查询对象\n instanceQueryContent: {\n appId: this.$store.state.appInfo.id,\n index: 0,\n pageSize: 10,\n instanceId: undefined,\n wfInstanceId: undefined,\n status: \"\",\n jobId: undefined,\n type: \"NORMAL\"\n },\n // 实例查询结果\n instancePageResult: {\n pageSize: 10,\n totalItems: 0,\n data: []\n },\n // 详细信息弹出框是否可见\n instanceDetailVisible: false,\n // 日志查询对象\n logQueryContent: {\n instanceId: undefined,\n index: 0\n },\n // 日志对象\n paginableInstanceLog: {\n index: 0,\n totalPages: 0,\n data: \"\"\n },\n // 日志弹出框是否可见\n instanceLogVisible: false,\n currentInstanceId: undefined,\n // 任务实例状态选择\n instanceStatusOptions: [{\n key: \"\",\n label: this.$t('message.all')\n }, {\n key: \"WAITING_DISPATCH\",\n label: this.$t('message.waitingDispatch')\n }, {\n key: \"WAITING_WORKER_RECEIVE\",\n label: this.$t('message.waitingWorkerReceive')\n }, {\n key: \"RUNNING\",\n label: this.$t('message.running')\n }, {\n key: \"FAILED\",\n label: this.$t('message.failed')\n }, {\n key: \"SUCCEED\",\n label: this.$t('message.success')\n }, {\n key: \"CANCELED\",\n label: this.$t('message.canceled')\n }, {\n key: \"STOPPED\",\n label: this.$t('message.stopped')\n }]\n };\n },\n methods: {\n // 查询任务实例信息\n listInstanceInfos: function listInstanceInfos() {\n var that = this;\n that.axios.post(\"/instance/list\", that.instanceQueryContent).then(function (res) {\n that.instancePageResult = res;\n });\n },\n // 点击重置按钮\n onClickRest: function onClickRest() {\n this.instanceQueryContent.jobId = undefined;\n this.instanceQueryContent.instanceId = undefined;\n this.instanceQueryContent.wfInstanceId = undefined;\n this.instanceQueryContent.status = \"\";\n this.listInstanceInfos();\n },\n // 点击查询详情\n onClickShowDetail: function onClickShowDetail(data) {\n this.instanceDetailVisible = true;\n this.currentInstanceId = data.instanceId;\n },\n // 点击重跑\n onClickRetryJob: function onClickRetryJob(data) {\n var _this = this;\n\n var that = this;\n var url = \"/instance/retry?instanceId=\" + data.instanceId;\n this.axios.get(url).then(function () {\n that.$message.success(_this.$t('message.success'));\n that.listInstanceInfos();\n });\n },\n // 点击停止实例\n onClickStop: function onClickStop(data) {\n var _this2 = this;\n\n var that = this;\n var url = \"/instance/stop?instanceId=\" + data.instanceId;\n this.axios.get(url).then(function () {\n that.$message.success(_this2.$t('message.success')); // 重新加载列表\n\n that.listInstanceInfos();\n });\n },\n // 换页\n onClickChangeInstancePage: function onClickChangeInstancePage(index) {\n // 后端从0开始,前端从1开始\n this.instanceQueryContent.index = index - 1;\n this.listInstanceInfos();\n },\n instanceTableRowClassName: function instanceTableRowClassName(_ref) {\n var row = _ref.row;\n\n switch (row.status) {\n // 失败\n case 4:\n return 'error-row';\n // 成功\n\n case 5:\n return 'success-row';\n\n case 9:\n case 10:\n return 'warning-row';\n }\n },\n // 查看日志\n queryLog: function queryLog() {\n var that = this;\n var url = \"/instance/log?instanceId=\" + this.logQueryContent.instanceId + \"&index=\" + this.logQueryContent.index;\n this.axios.get(url).then(function (res) {\n that.paginableInstanceLog = res;\n that.instanceLogVisible = true;\n });\n },\n // 查看在线日志\n onClickShowLog: function onClickShowLog(data) {\n this.logQueryContent.instanceId = data.instanceId;\n this.logQueryContent.index = 0;\n this.queryLog();\n },\n // 查看其它页的在线日志\n onClickChangeLogPage: function onClickChangeLogPage(index) {\n this.logQueryContent.index = index - 1;\n this.queryLog();\n },\n // 下载日志\n onclickDownloadLog: function onclickDownloadLog() {\n var url = \"/instance/downloadLogUrl?instanceId=\" + this.logQueryContent.instanceId;\n this.axios.get(url).then(function (res) {\n return window.open(res);\n });\n },\n // 获取状态\n fetchStatus: function fetchStatus(s) {\n return this.common.translateInstanceStatus(s);\n }\n },\n mounted: function mounted() {\n // 读取传递的参数\n var jobId = this.$route.params.jobId;\n\n if (jobId !== undefined) {\n this.instanceQueryContent.jobId = jobId;\n }\n\n this.listInstanceInfos();\n }\n});\n\n//# sourceURL=webpack:///./src/components/views/InstanceManager.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/* harmony import */ var _com
/***/ (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: \"instance_manager\" } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 22 } },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.instanceQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.jobId\") },\n model: {\n value: _vm.instanceQueryContent.jobId,\n callback: function($$v) {\n _vm.$set(_vm.instanceQueryContent, \"jobId\", $$v)\n },\n expression: \"instanceQueryContent.jobId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.instanceId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.instanceId\") },\n model: {\n value: _vm.instanceQueryContent.instanceId,\n callback: function($$v) {\n _vm.$set(\n _vm.instanceQueryContent,\n \"instanceId\",\n $$v\n )\n },\n expression: \"instanceQueryContent.instanceId\"\n }\n })\n ],\n 1\n ),\n _vm.instanceQueryContent.type === \"WORKFLOW\"\n ? _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfInstanceId\") } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\"message.wfInstanceId\")\n },\n model: {\n value: _vm.instanceQueryContent.wfInstanceId,\n callback: function($$v) {\n _vm.$set(\n _vm.instanceQueryContent,\n \"wfInstanceId\",\n $$v\n )\n },\n expression: \"instanceQueryContent.wfInstanceId\"\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.status\") } },\n [\n _c(\n \"el-select\",\n {\n attrs: { placeholder: _vm.$t(\"message.status\") },\n model: {\n value: _vm.instanceQueryContent.status,\n callback: function($$v) {\n _vm.$set(_vm.instanceQueryContent, \"status\", $$v)\n },\n expression: \"instanceQueryContent.status\"\n }\n },\n _vm._l(_vm.instanceStatusOptions, function(item) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\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.listInstanceInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickRest }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\"el-col\", { attrs: { span: 2 } }, [\n _c(\n \"div\",\n { staticStyle: { float: \"right\", \"padding-right\": \"10px\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.listInstanceInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.refresh\")))]\n )\n ],\n 1\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-tabs\",\n {\n attrs: { type: \"card\" },\n on: { \"tab-click\": _vm.listInstanceInfos },\n model: {\n value: _vm.instanceQueryContent.type,\n callback: function($$v) {\n _vm.$set(_vm.instanceQueryContent, \"type\", $$v)\n },\n expression: \"instanceQueryContent.type\"\n }\n },\n [\n _c(\"el-tab-pane\", {\n attrs: { label: _vm.$t(\"message.normalInstance\"), name: \"NORMAL\" }\n }),\n _c(\"el-tab-pane\", {\n attrs: { label: _vm.$t(\"message.wfInstance\"), name: \"WORKFLOW\" }\n })\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n data: _vm.instancePageResult.data,\n \"row-class-name\": _vm.instanceTableRowClassName\n }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"jobId\",\n label: _vm.$t(\"message.jobId\"),\n width: \"80\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"jobName\", label: _vm.$t(\"message.jobName\") }\n }),\n _vm.instanceQueryContent.type === \"WORKFLOW\"\n ? _c(\"el-table-column\", {\n attrs: {\n prop: \"wfInstanceId\",\n label: _vm.$t(\"message.wfInstanceId\")\n }\n })\n : _vm._e(),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"instanceId\",\n label: _vm.$t(\"message.instanceId\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"status\",\n label: _vm.$t(\"message.status\"),\n width: \"160\"\n },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" + _vm._s(_vm.fetchStatus(scope.row.status)) + \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"actualTriggerTime\",\n label: _vm.$t(\"message.triggerTime\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"finishedTime\",\n label: _vm.$t(\"message.finishedTime\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"操作\", width: \"300\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickShowDetail(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.detail\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickShowLog(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.log\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"medium\" },\n on: {\n click: function($event) {\n return _vm.onClickStop(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.stop\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 24 } },\n [\n _c(\"el-pagination\", {\n attrs: {\n total: this.instancePageResult.totalItems,\n \"page-size\": this.instancePageResult.pageSize,\n layout: \"prev, pager, next\"\n },\n on: { \"current-change\": _vm.onClickChangeInstancePage }\n })\n ],\n 1\n )\n ],\n 1\n ),\n _vm.instanceDetailVisible\n ? _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.instanceDetailVisible },\n on: {\n \"update:visible\": function($event) {\n _vm.instanceDetailVisible = $event\n }\n }\n },\n [\n _c(\"InstanceDetail\", {\n attrs: { \"instance-id\": _vm.currentInstanceId }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.instanceLogVisible, width: \"50%\" },\n on: {\n \"update:visible\": function($event) {\n _vm.instanceLogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n {\n staticStyle: { \"margin-bottom\": \"20px\" },\n attrs: { span: 4, offset: 20 }\n },\n [\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"primary\",\n size: \"mini\",\n icon: \"el-icon-download\"\n },\n on: {\n click: function($event) {\n return _vm.onclickDownloadLog()\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.download\")))]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-col\", { attrs: { span: 24 } }, [\n _c(\"h4\", { staticStyle: { \"white-space\": \"pre-line\" } }, [\n _vm._v(\" \" + _vm._s(this.paginableInstanceLog.data) + \" \")\n ])\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 24 } },\n [\n _c(\"el-pagination\", {\n attrs: {\n \"page-count\": _vm.paginableInstanceLog.totalPages,\n layout: \"prev, pager, next\"\n },\n on: { \"current-change\": _vm.onClickChangeLogPage }\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/InstanceManager.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: \"instance_manager\" } },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 22 } },\n [\n _c(\n \"el-form\",\n {\n staticClass: \"el-form--inline\",\n attrs: { inline: true, model: _vm.instanceQueryContent }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.jobId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.jobId\") },\n model: {\n value: _vm.instanceQueryContent.jobId,\n callback: function($$v) {\n _vm.$set(_vm.instanceQueryContent, \"jobId\", $$v)\n },\n expression: \"instanceQueryContent.jobId\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.instanceId\") } },\n [\n _c(\"el-input\", {\n attrs: { placeholder: _vm.$t(\"message.instanceId\") },\n model: {\n value: _vm.instanceQueryContent.instanceId,\n callback: function($$v) {\n _vm.$set(\n _vm.instanceQueryContent,\n \"instanceId\",\n $$v\n )\n },\n expression: \"instanceQueryContent.instanceId\"\n }\n })\n ],\n 1\n ),\n _vm.instanceQueryContent.type === \"WORKFLOW\"\n ? _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.wfInstanceId\") } },\n [\n _c(\"el-input\", {\n attrs: {\n placeholder: _vm.$t(\"message.wfInstanceId\")\n },\n model: {\n value: _vm.instanceQueryContent.wfInstanceId,\n callback: function($$v) {\n _vm.$set(\n _vm.instanceQueryContent,\n \"wfInstanceId\",\n $$v\n )\n },\n expression: \"instanceQueryContent.wfInstanceId\"\n }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-form-item\",\n { attrs: { label: _vm.$t(\"message.status\") } },\n [\n _c(\n \"el-select\",\n {\n attrs: { placeholder: _vm.$t(\"message.status\") },\n model: {\n value: _vm.instanceQueryContent.status,\n callback: function($$v) {\n _vm.$set(_vm.instanceQueryContent, \"status\", $$v)\n },\n expression: \"instanceQueryContent.status\"\n }\n },\n _vm._l(_vm.instanceStatusOptions, function(item) {\n return _c(\"el-option\", {\n key: item.key,\n attrs: { label: item.label, value: item.key }\n })\n }),\n 1\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.listInstanceInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.query\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { type: \"cancel\" },\n on: { click: _vm.onClickRest }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reset\")))]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\"el-col\", { attrs: { span: 2 } }, [\n _c(\n \"div\",\n { staticStyle: { float: \"right\", \"padding-right\": \"10px\" } },\n [\n _c(\n \"el-button\",\n {\n attrs: { type: \"primary\" },\n on: { click: _vm.listInstanceInfos }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.refresh\")))]\n )\n ],\n 1\n )\n ])\n ],\n 1\n ),\n _c(\n \"el-tabs\",\n {\n attrs: { type: \"card\" },\n on: { \"tab-click\": _vm.listInstanceInfos },\n model: {\n value: _vm.instanceQueryContent.type,\n callback: function($$v) {\n _vm.$set(_vm.instanceQueryContent, \"type\", $$v)\n },\n expression: \"instanceQueryContent.type\"\n }\n },\n [\n _c(\"el-tab-pane\", {\n attrs: { label: _vm.$t(\"message.normalInstance\"), name: \"NORMAL\" }\n }),\n _c(\"el-tab-pane\", {\n attrs: { label: _vm.$t(\"message.wfInstance\"), name: \"WORKFLOW\" }\n })\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-table\",\n {\n staticStyle: { width: \"100%\" },\n attrs: {\n data: _vm.instancePageResult.data,\n \"row-class-name\": _vm.instanceTableRowClassName\n }\n },\n [\n _c(\"el-table-column\", {\n attrs: {\n prop: \"jobId\",\n label: _vm.$t(\"message.jobId\"),\n width: \"80\"\n }\n }),\n _c(\"el-table-column\", {\n attrs: { prop: \"jobName\", label: _vm.$t(\"message.jobName\") }\n }),\n _vm.instanceQueryContent.type === \"WORKFLOW\"\n ? _c(\"el-table-column\", {\n attrs: {\n prop: \"wfInstanceId\",\n label: _vm.$t(\"message.wfInstanceId\")\n }\n })\n : _vm._e(),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"instanceId\",\n label: _vm.$t(\"message.instanceId\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"status\",\n label: _vm.$t(\"message.status\"),\n width: \"160\"\n },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _vm._v(\n \" \" + _vm._s(_vm.fetchStatus(scope.row.status)) + \" \"\n )\n ]\n }\n }\n ])\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"actualTriggerTime\",\n label: _vm.$t(\"message.triggerTime\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: {\n prop: \"finishedTime\",\n label: _vm.$t(\"message.finishedTime\")\n }\n }),\n _c(\"el-table-column\", {\n attrs: { label: \"操作\", width: \"300\" },\n scopedSlots: _vm._u([\n {\n key: \"default\",\n fn: function(scope) {\n return [\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"primary\" },\n on: {\n click: function($event) {\n return _vm.onClickShowDetail(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.detail\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"success\" },\n on: {\n click: function($event) {\n return _vm.onClickShowLog(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.log\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"warning\" },\n on: {\n click: function($event) {\n return _vm.onClickRetryJob(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.reRun\")))]\n ),\n _c(\n \"el-button\",\n {\n attrs: { size: \"mini\", type: \"danger\" },\n on: {\n click: function($event) {\n return _vm.onClickStop(scope.row)\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.stop\")))]\n )\n ]\n }\n }\n ])\n })\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 24 } },\n [\n _c(\"el-pagination\", {\n attrs: {\n total: this.instancePageResult.totalItems,\n \"page-size\": this.instancePageResult.pageSize,\n layout: \"prev, pager, next\"\n },\n on: { \"current-change\": _vm.onClickChangeInstancePage }\n })\n ],\n 1\n )\n ],\n 1\n ),\n _vm.instanceDetailVisible\n ? _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.instanceDetailVisible, width: \"80%\" },\n on: {\n \"update:visible\": function($event) {\n _vm.instanceDetailVisible = $event\n }\n }\n },\n [\n _c(\"InstanceDetail\", {\n attrs: { \"instance-id\": _vm.currentInstanceId }\n })\n ],\n 1\n )\n : _vm._e(),\n _c(\n \"el-dialog\",\n {\n attrs: { visible: _vm.instanceLogVisible, width: \"80%\" },\n on: {\n \"update:visible\": function($event) {\n _vm.instanceLogVisible = $event\n }\n }\n },\n [\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n {\n staticStyle: { \"margin-bottom\": \"20px\" },\n attrs: { span: 4, offset: 20 }\n },\n [\n _c(\n \"el-button\",\n {\n attrs: {\n type: \"primary\",\n size: \"mini\",\n icon: \"el-icon-download\"\n },\n on: {\n click: function($event) {\n return _vm.onclickDownloadLog()\n }\n }\n },\n [_vm._v(_vm._s(_vm.$t(\"message.download\")))]\n )\n ],\n 1\n )\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-col\", { attrs: { span: 24 } }, [\n _c(\"h4\", { staticStyle: { \"white-space\": \"pre-line\" } }, [\n _vm._v(\" \" + _vm._s(this.paginableInstanceLog.data) + \" \")\n ])\n ])\n ],\n 1\n ),\n _c(\n \"el-row\",\n [\n _c(\n \"el-col\",\n { attrs: { span: 24 } },\n [\n _c(\"el-pagination\", {\n attrs: {\n \"page-count\": _vm.paginableInstanceLog.totalPages,\n layout: \"prev, pager, next\"\n },\n on: { \"current-change\": _vm.onClickChangeLogPage }\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/InstanceManager.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");
/***/ }),
diff --git a/powerjob-server/src/main/resources/static/js/app.js b/powerjob-server/src/main/resources/static/js/app.js
index 7311d908..3fdea126 100644
--- a/powerjob-server/src/main/resources/static/js/app.js
+++ b/powerjob-server/src/main/resources/static/js/app.js
@@ -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 \"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");
+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 { attrs: { href: \"http://www.powerjob.tech/\", target: \"_blank\" } },\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_zb_Documents_own_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_zb_Documents_own_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 'all': '全部',\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 'omsServerTimezone': '调度服务器时区',\n 'localBrowserTime': '本地时间',\n 'localBrowserTimezone': '本地时区',\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 'expectedTriggerTime': '预计执行时间',\n 'result': '任务结果',\n 'subTaskInfo': 'Task 信息',\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 'canceled': '手动取消',\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_zb_Documents_own_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_zb_Documents_own_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 'all': '全部',\n 'more': '| 更多',\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 'omsServerTimezone': '调度服务器时区',\n 'localBrowserTime': '本地时间',\n 'localBrowserTimezone': '本地时区',\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 'runHistory': '运行记录',\n 'reRun': '重跑',\n // 任务实例管理\n 'wfInstanceId': '工作流实例ID',\n 'normalInstance': '普通任务实例',\n 'wfInstance': '工作流任务实例',\n 'triggerTime': '触发时间',\n 'finishedTime': '结束时间',\n 'log': '日志',\n 'runningTimes': '运行次数',\n 'taskTrackerAddress': 'TaskTracker 地址',\n 'startTime': '开始时间',\n 'expectedTriggerTime': '预计执行时间',\n 'result': '任务结果',\n 'subTaskInfo': 'Task 信息',\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 'canceled': '手动取消',\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_zb_Documents_own_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_zb_Documents_own_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 'all': 'ALL',\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 'omsServerTimezone': 'Server Timezone',\n 'localBrowserTime': 'Local Time',\n 'localBrowserTimezone': 'Local Timezone',\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 'expectedTriggerTime': 'expected trigger time',\n 'result': 'result',\n 'subTaskInfo': 'task 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 'canceled': 'canceled',\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_zb_Documents_own_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_zb_Documents_own_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 'all': 'ALL',\n 'more': '| more',\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 'omsServerTimezone': 'Server Timezone',\n 'localBrowserTime': 'Local Time',\n 'localBrowserTimezone': 'Local Timezone',\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 'runHistory': 'history',\n 'reRun': 'retry',\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 'expectedTriggerTime': 'expected trigger time',\n 'result': 'result',\n 'subTaskInfo': 'task 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 'canceled': 'canceled',\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_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _Users_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _Users_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Users_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_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?");
+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_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _Users_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _Users_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Users_zb_Documents_own_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_zb_Documents_own_PowerJob_Console_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Users_zb_Documents_own_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 = 10000;\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(\"/\"); // remove no appId warn due to too much user report this is a bug...\n\n return Promise.reject();\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?");
/***/ }),
@@ -736,7 +736,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 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 vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vue_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-router */ \"./node_modules/vue-router/dist/vue-router.esm.js\");\n/* harmony import */ var _components_Console__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/Console */ \"./src/components/Console.vue\");\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_1__[\"default\"].use(vue_router__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\nvar router = new vue_router__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n routes: [{\n path: \"/\",\n redirect: '/welcome'\n }, {\n path: \"/welcome\",\n component: function component() {\n return __webpack_require__.e(/*! import() */ 6).then(__webpack_require__.bind(null, /*! ./components/Welcome */ \"./src/components/Welcome.vue\"));\n }\n }, {\n path: \"/oms\",\n component: _components_Console__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n redirect: \"/oms/home\",\n children: [// 二级路由\n {\n path: \"/oms/home\",\n meta: {\n title: '主页'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 5).then(__webpack_require__.bind(null, /*! ./components/views/Home */ \"./src/components/views/Home.vue\"));\n }\n }, {\n path: \"/oms/job\",\n meta: {\n title: '任务管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 10).then(__webpack_require__.bind(null, /*! ./components/views/JobManager */ \"./src/components/views/JobManager.vue\"));\n }\n }, {\n path: \"/oms/instance\",\n meta: {\n title: '实例管理'\n },\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(8)]).then(__webpack_require__.bind(null, /*! ./components/views/InstanceManager */ \"./src/components/views/InstanceManager.vue\"));\n }\n }, {\n path: \"/oms/workflow\",\n meta: {\n title: '工作流管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 11).then(__webpack_require__.bind(null, /*! ./components/views/WorkflowManager */ \"./src/components/views/WorkflowManager.vue\"));\n }\n }, {\n path: \"/oms/wfinstance\",\n meta: {\n title: '工作流管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 9).then(__webpack_require__.bind(null, /*! ./components/views/WFInstanceManager */ \"./src/components/views/WFInstanceManager.vue\"));\n }\n }, {\n path: \"/oms/template\",\n meta: {\n title: '模版生成'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 3).then(__webpack_require__.bind(null, /*! ./components/views/ContainerTemplate */ \"./src/components/views/ContainerTemplate.vue\"));\n }\n }, {\n path: \"/oms/containermanage\",\n meta: {\n title: '容器管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 2).then(__webpack_require__.bind(null, /*! ./components/views/ContainerManager */ \"./src/components/views/ContainerManager.vue\"));\n }\n }, {\n path: \"/oms/wfInstanceDetail\",\n name: \"WorkflowInstanceDetail\",\n meta: {\n title: '工作流实例详情'\n },\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(7)]).then(__webpack_require__.bind(null, /*! ./components/dag/WorkflowInstanceDetail */ \"./src/components/dag/WorkflowInstanceDetail.vue\"));\n }\n }, {\n path: \"/oms/workflowEditor\",\n name: \"workflowEditor\",\n meta: {\n title: '工作流编辑器'\n },\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(4)]).then(__webpack_require__.bind(null, /*! ./components/dag/WorkflowEditor */ \"./src/components/dag/WorkflowEditor.vue\"));\n }\n }]\n }, // 调试用\n {\n path: \"/sidebar\",\n component: function component() {\n return Promise.resolve(/*! import() */).then(__webpack_require__.bind(null, /*! ./components/bar/Sidebar */ \"./src/components/bar/Sidebar.vue\"));\n }\n }, {\n path: \"/navbar\",\n component: function component() {\n return Promise.resolve(/*! import() */).then(__webpack_require__.bind(null, /*! ./components/bar/Navbar */ \"./src/components/bar/Navbar.vue\"));\n }\n }]\n}); // 默认导出,供 main.js 引入,作为项目的路由器\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (router);\n\n//# sourceURL=webpack:///./src/router.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 vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vue_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue-router */ \"./node_modules/vue-router/dist/vue-router.esm.js\");\n/* harmony import */ var _components_Console__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/Console */ \"./src/components/Console.vue\");\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_1__[\"default\"].use(vue_router__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\nvar router = new vue_router__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n routes: [{\n path: \"/\",\n redirect: '/welcome'\n }, {\n path: \"/welcome\",\n component: function component() {\n return __webpack_require__.e(/*! import() */ 6).then(__webpack_require__.bind(null, /*! ./components/Welcome */ \"./src/components/Welcome.vue\"));\n }\n }, {\n path: \"/oms\",\n component: _components_Console__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n redirect: \"/oms/home\",\n children: [// 二级路由\n {\n path: \"/oms/home\",\n meta: {\n title: '主页'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 5).then(__webpack_require__.bind(null, /*! ./components/views/Home */ \"./src/components/views/Home.vue\"));\n }\n }, {\n path: \"/oms/job\",\n meta: {\n title: '任务管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 10).then(__webpack_require__.bind(null, /*! ./components/views/JobManager */ \"./src/components/views/JobManager.vue\"));\n }\n }, {\n path: \"/oms/instance\",\n name: \"instanceManager\",\n meta: {\n title: '实例管理'\n },\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(8)]).then(__webpack_require__.bind(null, /*! ./components/views/InstanceManager */ \"./src/components/views/InstanceManager.vue\"));\n }\n }, {\n path: \"/oms/workflow\",\n meta: {\n title: '工作流管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 11).then(__webpack_require__.bind(null, /*! ./components/views/WorkflowManager */ \"./src/components/views/WorkflowManager.vue\"));\n }\n }, {\n path: \"/oms/wfinstance\",\n meta: {\n title: '工作流管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 9).then(__webpack_require__.bind(null, /*! ./components/views/WFInstanceManager */ \"./src/components/views/WFInstanceManager.vue\"));\n }\n }, {\n path: \"/oms/template\",\n meta: {\n title: '模版生成'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 3).then(__webpack_require__.bind(null, /*! ./components/views/ContainerTemplate */ \"./src/components/views/ContainerTemplate.vue\"));\n }\n }, {\n path: \"/oms/containermanage\",\n meta: {\n title: '容器管理'\n },\n component: function component() {\n return __webpack_require__.e(/*! import() */ 2).then(__webpack_require__.bind(null, /*! ./components/views/ContainerManager */ \"./src/components/views/ContainerManager.vue\"));\n }\n }, {\n path: \"/oms/wfInstanceDetail\",\n name: \"WorkflowInstanceDetail\",\n meta: {\n title: '工作流实例详情'\n },\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(7)]).then(__webpack_require__.bind(null, /*! ./components/dag/WorkflowInstanceDetail */ \"./src/components/dag/WorkflowInstanceDetail.vue\"));\n }\n }, {\n path: \"/oms/workflowEditor\",\n name: \"workflowEditor\",\n meta: {\n title: '工作流编辑器'\n },\n component: function component() {\n return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(4)]).then(__webpack_require__.bind(null, /*! ./components/dag/WorkflowEditor */ \"./src/components/dag/WorkflowEditor.vue\"));\n }\n }]\n }, // 调试用\n {\n path: \"/sidebar\",\n component: function component() {\n return Promise.resolve(/*! import() */).then(__webpack_require__.bind(null, /*! ./components/bar/Sidebar */ \"./src/components/bar/Sidebar.vue\"));\n }\n }, {\n path: \"/navbar\",\n component: function component() {\n return Promise.resolve(/*! import() */).then(__webpack_require__.bind(null, /*! ./components/bar/Navbar */ \"./src/components/bar/Navbar.vue\"));\n }\n }]\n}); // 默认导出,供 main.js 引入,作为项目的路由器\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (router);\n\n//# sourceURL=webpack:///./src/router.js?");
/***/ }),
diff --git a/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java b/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java
index 8350e6e5..c6ebe28b 100644
--- a/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java
+++ b/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java
@@ -1,5 +1,6 @@
package com.github.kfcfans.powerjob.server.test;
+import com.github.kfcfans.powerjob.server.OhMyApplication;
import com.github.kfcfans.powerjob.server.common.utils.CronExpression;
import com.github.kfcfans.powerjob.server.common.utils.timewheel.HashedWheelTimer;
import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerFuture;
diff --git a/powerjob-worker-agent/pom.xml b/powerjob-worker-agent/pom.xml
index 82211504..42d7ef9f 100644
--- a/powerjob-worker-agent/pom.xml
+++ b/powerjob-worker-agent/pom.xml
@@ -5,17 +5,17 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-worker-agent
- 3.2.1
+ 3.2.2
jar
- 3.2.1
+ 3.2.2
1.2.3
4.3.2
diff --git a/powerjob-worker-samples/pom.xml b/powerjob-worker-samples/pom.xml
index e2500e5a..3b0f37e2 100644
--- a/powerjob-worker-samples/pom.xml
+++ b/powerjob-worker-samples/pom.xml
@@ -5,16 +5,16 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-worker-samples
- 3.2.1
+ 3.2.2
2.2.6.RELEASE
- 3.2.1
+ 3.2.2
1.2.68
@@ -43,8 +43,8 @@
com.github.kfcfans
- powerjob-worker
- ${powerjob.worker.version}
+ powerjob-worker-spring-boot-starter
+ ${powerjob.worker.starter.version}
diff --git a/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java
index 3cc8b8ca..74b9defc 100644
--- a/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java
+++ b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java
@@ -1,17 +1,10 @@
package com.github.kfcfans.powerjob.samples;
-import com.github.kfcfans.powerjob.worker.OhMyWorker;
-import com.github.kfcfans.powerjob.worker.common.OhMyConfig;
-import com.github.kfcfans.powerjob.worker.common.constants.StoreStrategy;
-import com.google.common.collect.Lists;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import java.util.List;
-
/**
- * OMS-Worker 配置
+ * powerjob-worker 配置
+ * 代码配置示例,SpringBoot 项目支持使用 starter,只需要在 application.properties 中完成配置即可
*
* @author tjq
* @since 2020/4/17
@@ -19,8 +12,7 @@ import java.util.List;
@Configuration
public class OhMySchedulerConfig {
- @Value("${powerjob.akka.port}")
- private int port;
+ /*
@Bean
public OhMyWorker initOMS() throws Exception {
@@ -30,16 +22,18 @@ public class OhMySchedulerConfig {
// 1. 创建配置文件
OhMyConfig config = new OhMyConfig();
- config.setPort(port);
+ config.setPort(27777);
config.setAppName("powerjob-agent-test");
config.setServerAddress(serverAddress);
// 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算
- // 为了本地模拟多个实例,只能使用 MEMORY 启动(文件只能由一个应用占有)
- config.setStoreStrategy(StoreStrategy.MEMORY);
+ config.setStoreStrategy(StoreStrategy.DISK);
// 2. 创建 Worker 对象,设置配置文件
OhMyWorker ohMyWorker = new OhMyWorker();
ohMyWorker.setConfig(config);
return ohMyWorker;
+
}
+
+ */
}
diff --git a/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/tester/StopInstanceTester.java b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/tester/StopInstanceTester.java
new file mode 100644
index 00000000..4a70523c
--- /dev/null
+++ b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/tester/StopInstanceTester.java
@@ -0,0 +1,25 @@
+package com.github.kfcfans.powerjob.samples.tester;
+
+import com.github.kfcfans.powerjob.worker.core.processor.ProcessResult;
+import com.github.kfcfans.powerjob.worker.core.processor.TaskContext;
+import com.github.kfcfans.powerjob.worker.core.processor.sdk.BasicProcessor;
+import org.springframework.stereotype.Component;
+
+/**
+ * 测试用户反馈的无法停止实例的问题
+ * https://github.com/KFCFans/PowerJob/issues/37
+ *
+ * @author tjq
+ * @since 2020/7/30
+ */
+@Component
+public class StopInstanceTester implements BasicProcessor {
+ @Override
+ public ProcessResult process(TaskContext context) throws Exception {
+ int i = 0;
+ while (true) {
+ System.out.println(i++);
+ Thread.sleep(1000*10);
+ }
+ }
+}
diff --git a/powerjob-worker-samples/src/main/resources/application.properties b/powerjob-worker-samples/src/main/resources/application.properties
index 7d804f17..ef35ebd2 100644
--- a/powerjob-worker-samples/src/main/resources/application.properties
+++ b/powerjob-worker-samples/src/main/resources/application.properties
@@ -2,4 +2,12 @@ server.port=8081
spring.jpa.open-in-view=false
-powerjob.akka.port=27777
\ No newline at end of file
+########### powerjob-worker 配置 ###########
+# akka 工作端口,可选,默认 27777
+powerjob.akka-port=27777
+# 接入应用名称,用于分组隔离,推荐填写 本 Java 项目名称
+powerjob.app-name=powerjob-agent-test
+# 调度服务器地址,IP:Port 或 域名,多值逗号分隔
+powerjob.server-address=127.0.0.1:7700,127.0.0.1:7701
+# 持久化方式,可选,默认 disk
+powerjob.store-strategy=disk
\ No newline at end of file
diff --git a/powerjob-worker-spring-boot-starter/pom.xml b/powerjob-worker-spring-boot-starter/pom.xml
index 1e7eb819..d778229d 100644
--- a/powerjob-worker-spring-boot-starter/pom.xml
+++ b/powerjob-worker-spring-boot-starter/pom.xml
@@ -5,16 +5,16 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-worker-spring-boot-starter
- 3.2.1
+ 3.2.2
jar
- 3.2.1
+ 3.2.2
2.2.6.RELEASE
diff --git a/powerjob-worker/pom.xml b/powerjob-worker/pom.xml
index 63661bc0..9aee1ae2 100644
--- a/powerjob-worker/pom.xml
+++ b/powerjob-worker/pom.xml
@@ -5,17 +5,17 @@
powerjob
com.github.kfcfans
- 1.0.0
+ 2.0.0
4.0.0
powerjob-worker
- 3.2.1
+ 3.2.2
jar
5.2.4.RELEASE
- 3.2.1
+ 3.2.2
1.4.200
3.4.2
5.6.1
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java
index 5b43a04c..3a78f2f9 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java
@@ -12,16 +12,15 @@ import com.github.kfcfans.powerjob.common.utils.CommonUtils;
import com.github.kfcfans.powerjob.common.utils.HttpUtils;
import com.github.kfcfans.powerjob.common.utils.JsonUtils;
import com.github.kfcfans.powerjob.common.utils.NetUtils;
-import com.github.kfcfans.powerjob.worker.actors.TroubleshootingActor;
import com.github.kfcfans.powerjob.worker.actors.ProcessorTrackerActor;
import com.github.kfcfans.powerjob.worker.actors.TaskTrackerActor;
+import com.github.kfcfans.powerjob.worker.actors.TroubleshootingActor;
import com.github.kfcfans.powerjob.worker.actors.WorkerActor;
import com.github.kfcfans.powerjob.worker.background.OmsLogHandler;
import com.github.kfcfans.powerjob.worker.background.ServerDiscoveryService;
import com.github.kfcfans.powerjob.worker.background.WorkerHealthReporter;
import com.github.kfcfans.powerjob.worker.common.OhMyConfig;
import com.github.kfcfans.powerjob.worker.common.OmsBannerPrinter;
-import com.github.kfcfans.powerjob.worker.common.utils.OmsWorkerFileUtils;
import com.github.kfcfans.powerjob.worker.common.utils.SpringUtils;
import com.github.kfcfans.powerjob.worker.persistence.TaskPersistenceService;
import com.google.common.base.Stopwatch;
@@ -31,7 +30,6 @@ import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
@@ -39,7 +37,6 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.StringUtils;
-import java.io.File;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.Executors;
@@ -83,7 +80,6 @@ public class OhMyWorker implements ApplicationContextAware, InitializingBean, Di
Stopwatch stopwatch = Stopwatch.createStarted();
log.info("[OhMyWorker] start to initialize OhMyWorker...");
try {
- pre();
OmsBannerPrinter.print();
// 校验 appName
if (!config.isEnableTestMode()) {
@@ -183,14 +179,4 @@ public class OhMyWorker implements ApplicationContextAware, InitializingBean, Di
public void destroy() throws Exception {
timingPool.shutdownNow();
}
-
- private static void pre() {
- // 删除历史遗留的 H2 数据库文件
- String h2Path = OmsWorkerFileUtils.getH2Dir();
- try {
- FileUtils.forceDeleteOnExit(new File(h2Path));
- }catch (Exception e) {
- log.warn("[PowerJob] delete h2 workspace({}) failed, if worker can't startup successfully, please delete it manually", h2Path, e);
- }
- }
}
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OmsWorkerVersion.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OmsWorkerVersion.java
index ce324db4..c1fc0eb4 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OmsWorkerVersion.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/OmsWorkerVersion.java
@@ -1,5 +1,7 @@
package com.github.kfcfans.powerjob.worker.common;
+import org.apache.commons.lang3.StringUtils;
+
import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
@@ -17,6 +19,8 @@ import java.util.jar.JarFile;
*/
public final class OmsWorkerVersion {
+ private static String CACHE = null;
+
/**
* Return the full version string of the present OhMyScheduler-Worker codebase, or {@code null}
* if it cannot be determined.
@@ -24,7 +28,10 @@ public final class OmsWorkerVersion {
* @see Package#getImplementationVersion()
*/
public static String getVersion() {
- return determineSpringBootVersion();
+ if (StringUtils.isEmpty(CACHE)) {
+ CACHE = determineSpringBootVersion();
+ }
+ return CACHE;
}
private static String determineSpringBootVersion() {
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java
index 823e5504..668238f5 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java
@@ -1,5 +1,8 @@
package com.github.kfcfans.powerjob.worker.common.utils;
+import com.github.kfcfans.powerjob.common.utils.CommonUtils;
+import com.github.kfcfans.powerjob.worker.OhMyWorker;
+
/**
* 文件工具类
*
@@ -9,7 +12,7 @@ package com.github.kfcfans.powerjob.worker.common.utils;
public class OmsWorkerFileUtils {
private static final String USER_HOME = System.getProperty("user.home", "powerjob");
- private static final String WORKER_DIR = USER_HOME + "/powerjob/";
+ private static final String WORKER_DIR = USER_HOME + "/powerjob/" + OhMyWorker.getConfig().getAppName() + "/";
public static String getScriptDir() {
return WORKER_DIR + "script/";
@@ -19,7 +22,7 @@ public class OmsWorkerFileUtils {
return WORKER_DIR + "container/";
}
- public static String getH2Dir() {
- return WORKER_DIR + "h2/";
+ public static String getH2WorkDir() {
+ return WORKER_DIR + "h2/" + CommonUtils.genUUID() + "/";
}
}
diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/SystemInfoUtils.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/SystemInfoUtils.java
index cb6d1a58..d213608d 100644
--- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/SystemInfoUtils.java
+++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/SystemInfoUtils.java
@@ -5,6 +5,8 @@ import com.github.kfcfans.powerjob.common.model.SystemMetrics;
import java.io.File;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
+import java.math.RoundingMode;
+import java.text.NumberFormat;
/**
* 系统信息工具,用于采集监控指标
@@ -14,26 +16,47 @@ import java.lang.management.OperatingSystemMXBean;
*/
public class SystemInfoUtils {
+ private static final NumberFormat NF = NumberFormat.getNumberInstance();
+ static {
+ NF.setMaximumFractionDigits(4);
+ NF.setMinimumFractionDigits(4);
+ NF.setRoundingMode(RoundingMode.HALF_UP);
+ }
+
// JMX bean can be accessed externally and is meant for management tools like hyperic ( or even nagios ) - It would delegate to Runtime anyway.
private static final Runtime runtime = Runtime.getRuntime();
- private static OperatingSystemMXBean osMXBean = ManagementFactory.getOperatingSystemMXBean();
+ private static final OperatingSystemMXBean osMXBean = ManagementFactory.getOperatingSystemMXBean();
public static SystemMetrics getSystemMetrics() {
SystemMetrics metrics = new SystemMetrics();
- // CPU 信息
+ fillCPUInfo(metrics);
+ fillMemoryInfo(metrics);
+ fillDiskInfo(metrics);
+
+ // 在Worker完成分数计算,减小Server压力
+ metrics.calculateScore();
+ return metrics;
+ }
+
+ private static void fillCPUInfo(SystemMetrics metrics) {
metrics.setCpuProcessors(osMXBean.getAvailableProcessors());
- metrics.setCpuLoad(osMXBean.getSystemLoadAverage() / osMXBean.getAvailableProcessors());
+ metrics.setCpuLoad(miniDouble(osMXBean.getSystemLoadAverage()));
+ }
+ private static void fillMemoryInfo(SystemMetrics metrics) {
// JVM内存信息(maxMemory指JVM能从操作系统获取的最大内存,即-Xmx参数设置的值,totalMemory指JVM当前持久的总内存)
- metrics.setJvmMaxMemory(bytes2GB(runtime.maxMemory()));
+ long maxMemory = runtime.maxMemory();
+ long usedMemory = runtime.totalMemory() - runtime.freeMemory();
+ metrics.setJvmMaxMemory(bytes2GB(maxMemory));
// 已使用内存:当前申请总量 - 当前空余量
- metrics.setJvmUsedMemory(bytes2GB(runtime.totalMemory() - runtime.freeMemory()));
- // 百分比,直接 * 100
- metrics.setJvmMemoryUsage(1.0 * metrics.getJvmUsedMemory() / runtime.maxMemory());
+ metrics.setJvmUsedMemory(bytes2GB(usedMemory));
+ // 已用内存比例
+ metrics.setJvmMemoryUsage(miniDouble((double) usedMemory / maxMemory));
+ }
- // 磁盘信息
+ private static void fillDiskInfo(SystemMetrics metrics) {
long free = 0;
long total = 0;
File[] roots = File.listRoots();
@@ -44,16 +67,15 @@ public class SystemInfoUtils {
metrics.setDiskUsed(bytes2GB(total - free));
metrics.setDiskTotal(bytes2GB(total));
- metrics.setDiskUsage(metrics.getDiskUsed() / metrics.getDiskTotal() * 1.0);
-
- // 在Worker完成分数计算,减小Server压力
- metrics.calculateScore();
- return metrics;
+ metrics.setDiskUsage(miniDouble(metrics.getDiskUsed() / metrics.getDiskTotal()));
}
-
private static double bytes2GB(long bytes) {
- return bytes / 1024.0 / 1024 / 1024;
+ return miniDouble(bytes / 1024.0 / 1024 / 1024);
+ }
+
+ private static double miniDouble(double origin) {
+ return Double.parseDouble(NF.format(origin));
}
}
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 aa630a9b..0603576a 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
@@ -5,8 +5,12 @@ import com.github.kfcfans.powerjob.worker.common.constants.StoreStrategy;
import com.github.kfcfans.powerjob.worker.common.utils.OmsWorkerFileUtils;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.h2.Driver;
import javax.sql.DataSource;
+import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
@@ -16,12 +20,14 @@ import java.sql.SQLException;
* @author tjq
* @since 2020/3/17
*/
+@Slf4j
public class ConnectionFactory {
private static volatile DataSource dataSource;
- private static final String DISK_JDBC_URL = String.format("jdbc:h2:file:%spowerjob_worker_db", OmsWorkerFileUtils.getH2Dir());
- private static final String MEMORY_JDBC_URL = String.format("jdbc:h2:mem:%spowerjob_worker_db", OmsWorkerFileUtils.getH2Dir());
+ private static final String H2_PATH = OmsWorkerFileUtils.getH2WorkDir();
+ private static final String DISK_JDBC_URL = String.format("jdbc:h2:file:%spowerjob_worker_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", H2_PATH);
+ private static final String MEMORY_JDBC_URL = String.format("jdbc:h2:mem:%spowerjob_worker_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", H2_PATH);
public static Connection getConnection() throws SQLException {
return getDataSource().getConnection();
@@ -38,7 +44,7 @@ public class ConnectionFactory {
StoreStrategy strategy = OhMyWorker.getConfig() == null ? StoreStrategy.DISK : OhMyWorker.getConfig().getStoreStrategy();
HikariConfig config = new HikariConfig();
- config.setDriverClassName("org.h2.Driver");
+ config.setDriverClassName(Driver.class.getName());
config.setJdbcUrl(strategy == StoreStrategy.DISK ? DISK_JDBC_URL : MEMORY_JDBC_URL);
config.setAutoCommit(true);
// 池中最小空闲连接数量
@@ -46,6 +52,14 @@ public class ConnectionFactory {
// 池中最大连接数量
config.setMaximumPoolSize(32);
dataSource = new HikariDataSource(config);
+
+ log.info("[OmsDatasource] init h2 datasource successfully, use url: {}", config.getJdbcUrl());
+
+ // JVM 关闭时删除数据库文件
+ try {
+ FileUtils.forceDeleteOnExit(new File(H2_PATH));
+ }catch (Exception ignore) {
+ }
}
}
return dataSource;
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 0180b9ca..b967af3e 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
@@ -36,7 +36,7 @@ public class TaskPersistenceService {
private TaskPersistenceService() {
}
- private TaskDAO taskDAO = new TaskDAOImpl();
+ private final TaskDAO taskDAO = new TaskDAOImpl();
public void init() throws Exception {
if (initialized) {
@@ -207,8 +207,8 @@ public class TaskPersistenceService {
Map result = Maps.newHashMap();
dbRES.forEach(row -> {
// H2 数据库都是大写...
- int status = Integer.parseInt(String.valueOf(row.get("STATUS")));
- long num = Long.parseLong(String.valueOf(row.get("NUM")));
+ int status = Integer.parseInt(String.valueOf(row.get("status")));
+ long num = Long.parseLong(String.valueOf(row.get("num")));
result.put(TaskStatus.of(status), num);
});
return result;
@@ -238,10 +238,10 @@ public class TaskPersistenceService {
try {
SimpleTaskQuery query = genKeyQuery(instanceId, taskId);
- query.setQueryContent("STATUS");
+ query.setQueryContent("status");
return execute(() -> {
List