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> rows = taskDAO.simpleQueryPlus(query); - return Optional.of(TaskStatus.of((int) rows.get(0).get("STATUS"))); + return Optional.of(TaskStatus.of((int) rows.get(0).get("status"))); }); }catch (Exception e) { log.error("[TaskPersistenceService] getTaskStatus failed, instanceId={},taskId={}.", instanceId, taskId, e); diff --git a/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/function/MonitorTest.java b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/function/MonitorTest.java new file mode 100644 index 00000000..3cb53acb --- /dev/null +++ b/powerjob-worker/src/test/java/com/github/kfcfans/powerjob/function/MonitorTest.java @@ -0,0 +1,78 @@ +package com.github.kfcfans.powerjob.function; + +import com.github.kfcfans.powerjob.common.model.SystemMetrics; +import com.github.kfcfans.powerjob.common.utils.JsonUtils; +import com.github.kfcfans.powerjob.worker.common.utils.SystemInfoUtils; +import com.google.common.base.Stopwatch; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; +import java.lang.management.OperatingSystemMXBean; +import java.util.Collections; +import java.util.List; + +/** + * 测试监控指标 + * + * @author tjq + * @since 2020/8/1 + */ +public class MonitorTest { + + private static final OperatingSystemMXBean osMXBean = ManagementFactory.getOperatingSystemMXBean(); + private static final Runtime runtime = Runtime.getRuntime(); + + @Test + public void testGetSystemLoadAverage() { + for (int i = 0; i < 10000; i++) { + double average = osMXBean.getSystemLoadAverage(); + System.out.println(average); + System.out.println(average / osMXBean.getAvailableProcessors()); + try { + Thread.sleep(1000); + }catch (Exception ignore) { + } + } + } + + @Test + public void testListDisk() { + Stopwatch sw = Stopwatch.createStarted(); + SystemMetrics systemMetrics = SystemInfoUtils.getSystemMetrics(); + System.out.println(JsonUtils.toJSONString(systemMetrics)); + System.out.println(sw.stop()); + Stopwatch sw2 = Stopwatch.createStarted(); + System.out.println(systemMetrics.calculateScore()); + System.out.println(sw2.stop()); + } + + @Test + public void testMemory() { + System.out.println("- used:" + (runtime.totalMemory() - runtime.freeMemory())); + MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); + System.out.println("heap used: " + memoryMXBean.getHeapMemoryUsage()); + System.out.println("noheap used: " + memoryMXBean.getNonHeapMemoryUsage()); + } + + @Test + public void testFetchMetrics() { + SystemMetrics systemMetrics = SystemInfoUtils.getSystemMetrics(); + System.out.println(JsonUtils.toJSONString(systemMetrics)); + } + + @Test + public void testSortMetrics() { + SystemMetrics high = new SystemMetrics(); + high.setScore(100); + SystemMetrics low = new SystemMetrics(); + low.setScore(1); + List list = Lists.newArrayList(high, low); + list.sort((o1, o2) -> o2.calculateScore() - o1.calculateScore()); + System.out.println(list); + + Collections.sort(list); + System.out.println(list); + } +}