docs: translate for internationalization #152

This commit is contained in:
tjq 2021-01-10 10:47:32 +08:00
commit 078db73bce
35 changed files with 419 additions and 220 deletions

View File

@ -58,7 +58,7 @@ Application password: 123
| Distributed strategy | Unsupported | Static sharding | MapReduce dynamic sharding | **MapReduce dynamic sharding** |
| Online task management | Unsupported | Supported | Supported | **Supported** |
| Online logging | Unsupported | Supported | Unsupported | **Supported** |
| Scheduling methods and performance | Based on database lock, there is a performance bottleneck | Based on database lock, there is a performance bottleneck | Unknown | **Lock-free design, powerful performance without upper limit** |
| Scheduling methods and performance | Based on database lock, there is a performance bottleneck | Based on database lock, there is a performance bottleneck | Unknown | **Lock-free design, high performance without upper limit** |
| Alarm monitoring | Unsupported | Email | SMS | **Email, WebHook, DingTalk. An interface is provided for customization.** |
| System dependence | Any relational database (MySQL, Oracle ...) supported by JDBC | MySQL | RMB (Public Beta version for free, hey, helping to promote) | **Any relational database (MySQL, Oracle ...) supported by Spring Data Jpa** |
| workflow | Unsupported | Unsupported | Supported | **Supported** |

12
pom.xml
View File

@ -87,7 +87,7 @@
<testTarget>${java.version}</testTarget>
</configuration>
</plugin>
<!-- 打包源码 -->
<!-- Package source codes -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
@ -121,9 +121,9 @@
<artifactId>maven-javadoc-plugin</artifactId>
<version>${maven-javadoc-plugin.version}</version>
<configuration>
<!-- JavaDoc 编译错误不影响正常构建 -->
<!-- Prevent JavaDoc error from affecting building project. -->
<failOnError>false</failOnError>
<!-- 非严格模式...以后要好好按格式写注释啊... -->
<!-- Non-strict mode -->
<additionalJOption>-Xdoclint:none</additionalJOption>
</configuration>
<executions>
@ -164,7 +164,7 @@
</distributionManagement>
</profile>
<!-- 本地使用 -->
<!-- Local profile -->
<profile>
<id>dev</id>
<activation>
@ -173,7 +173,7 @@
<build>
<plugins>
<!-- 编译插件 -->
<!-- Maven compiler plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
@ -185,7 +185,7 @@
<testTarget>${java.version}</testTarget>
</configuration>
</plugin>
<!-- 编辑 MANIFEST.MF -->
<!-- Edit MANIFEST.MF -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>

View File

@ -37,7 +37,7 @@
<version>${powerjob.common.version}</version>
</dependency>
<!-- Junit 测试 -->
<!-- Junit tests -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>

View File

@ -25,7 +25,7 @@ import java.util.Objects;
import static com.github.kfcfans.powerjob.client.TypeStore.*;
/**
* OpenAPI 客户端
* OhMyClient, the client for OpenAPI.
*
* @author tjq
* @since 2020/4/15
@ -40,9 +40,9 @@ public class OhMyClient {
private static final String URL_PATTERN = "http://%s%s%s";
/**
* 初始化 OhMyClient 客户端
* Init OhMyClient with domain, appName and password.
* @param domain 比如 www.powerjob-server.com内网域名自行完成 DNS & Proxy
* @param appName 负责的应用名称
* @param appName name of the application
*/
public OhMyClient(String domain, String appName, String password) {
this(Lists.newArrayList(domain), appName, password);
@ -50,9 +50,9 @@ public class OhMyClient {
/**
* 初始化 OhMyClient 客户端
* @param addressList IP:Port 列表
* @param appName 负责的应用名称
* nit OhMyClient with server address, appName and password.
* @param addressList IP:Port address list
* @param appName name of the application
*/
public OhMyClient(List<String> addressList, String appName, String password) {
@ -199,7 +199,7 @@ public class OhMyClient {
return runJob(jobId, null, 0);
}
/* ************* Instance ************* */
/* ************* Instance API list ************* */
/**
* 停止应用实例
* @param instanceId 应用实例ID
@ -275,7 +275,7 @@ public class OhMyClient {
return JSONObject.parseObject(post, INSTANCE_RESULT_TYPE);
}
/* ************* Workflow ************* */
/* ************* Workflow API list ************* */
/**
* 保存工作流包括创建和修改
* @param request 创建/修改 Workflow 请求
@ -374,7 +374,7 @@ public class OhMyClient {
return runWorkflow(workflowId, null, 0);
}
/* ************* Workflow Instance ************* */
/* ************* Workflow Instance API list ************* */
/**
* 停止应用实例
* @param wfInstanceId 工作流实例ID

View File

@ -4,7 +4,7 @@ import com.alibaba.fastjson.TypeReference;
import com.github.kfcfans.powerjob.common.response.*;
/**
* 类型工厂
* TypeReference store.
*
* @author tjq
* @since 11/7/20

View File

@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test;
import java.util.concurrent.TimeUnit;
/**
* 测试 Client
* Test cases for {@link OhMyClient}
*
* @author tjq
* @since 2020/4/15
@ -110,7 +110,7 @@ public class TestClient {
ResultDTO<Long> startRes = ohMyClient.runJob(15L, "start by OhMyClient", 2000000);
System.out.println("runJob result: " + JSONObject.toJSONString(startRes));
// 手动重启 server干掉时间轮中的调度数据
// Restart server manually and clear all the data in time wheeler.
TimeUnit.MINUTES.sleep(1);
ResultDTO<Void> cancelRes = ohMyClient.cancelInstance(startRes.getData());

View File

@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test;
import java.util.List;
/**
* 测试 Clientworkflow部分
* Test cases for {@link OhMyClient} workflow.
*
* @author tjq
* @since 2020/6/2

View File

@ -76,7 +76,7 @@
<version>${commons.io.version}</version>
</dependency>
<!-- Junit 测试 -->
<!-- Junit tests -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>

View File

@ -1,7 +1,7 @@
package com.github.kfcfans.powerjob.common;
/**
* 容器常量
* Container constants.
*
* @author tjq
* @since 2020/5/15
@ -9,13 +9,16 @@ package com.github.kfcfans.powerjob.common;
public class ContainerConstant {
/**
* spring-context 配置文件名称
* Spring-context configuration file name of the container.
*/
public static final String SPRING_CONTEXT_FILE_NAME = "oms-worker-container-spring-context.xml";
/**
* container 属性文件名称
* Property file name of the container.
*/
public static final String CONTAINER_PROPERTIES_FILE_NAME = "oms-worker-container.properties";
/**
* Package name of the container.
*/
public static final String CONTAINER_PACKAGE_NAME_KEY = "PACKAGE_NAME";
}

View File

@ -1,13 +1,22 @@
package com.github.kfcfans.powerjob.common;
/**
* 部署环境
* Environment Enum class.
*
* @author tjq
* @since 2020/5/3
*/
public enum Env {
/**
* Development or test environment.
*/
DAILY,
/**
* Pre-release environment.
*/
PRE,
/**
* Production environment.
*/
PRODUCT
}

View File

@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 任务执行类型
* Execution type.
*
* @author tjq
* @since 2020/3/17
@ -12,8 +12,17 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ExecuteType {
/**
* Standalone type of task.
*/
STANDALONE(1, "单机执行"),
/**
* Broadcast type of task.
*/
BROADCAST(2, "广播执行"),
/**
* MapReduce type of task.
*/
MAP_REDUCE(3, "MapReduce"),
MAP(4, "Map");

View File

@ -1,7 +1,7 @@
package com.github.kfcfans.powerjob.common;
/**
* 公共常量
* Common constants.
*
* @author tjq
* @since 2020/5/31

View File

@ -3,7 +3,7 @@ package com.github.kfcfans.powerjob.common;
import java.io.Serializable;
/**
* PowerJob 序列化标记接口
* PowerJob serializable interface.
*
* @author tjq
* @since 2020/4/16

View File

@ -6,7 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 已部署的容器信息
* The class for deployed container.
*
* @author tjq
* @since 2020/5/18
@ -16,12 +16,20 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class DeployedContainerInfo implements OmsSerializable {
// 容器ID
/**
* Id of the container.
*/
private Long containerId;
// 版本
/**
* Version of the container.
*/
private String version;
// 部署时间
/**
* Deploy timestamp.
*/
private long deployedTime;
// 机器地址无需上报
/**
* Address of the server. Report is not required.
*/
private String workerAddress;
}

View File

@ -3,19 +3,27 @@ package com.github.kfcfans.powerjob.common.model;
import lombok.Data;
/**
* Git代码库信息
* The class for Git Repository info.
*
* @author tjq
* @since 2020/5/17
*/
@Data
public class GitRepoInfo {
// 仓库地址
/**
* Address of Git repository.
*/
private String repo;
// 分支名称
/**
* Name of the branch.
*/
private String branch;
// 用户名
/**
* username of Git.
*/
private String username;
// 密码
/**
* Password of Git.
*/
private String password;
}

View File

@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
import java.util.List;
/**
* 任务实例的运行详细信息
* Detailed info of task instances.
*
* @author tjq
* @since 2020/4/11
@ -16,33 +16,62 @@ import java.util.List;
@NoArgsConstructor
public class InstanceDetail implements OmsSerializable {
// 任务预计执行时间
/**
* Expected trigger time.
*/
private Long expectedTriggerTime;
// 任务整体开始时间
/**
* Actual trigger time of an instance.
*/
private Long actualTriggerTime;
// 任务整体结束时间可能不存在
/**
* Finish time of an instance, which may be null.
*/
private Long finishedTime;
// 任务状态
/**
* Status of the task instance.
*/
private Integer status;
// 任务执行结果可能不存在
/**
* Execution result, which may be null.
*/
private String result;
// TaskTracker地址
/**
* Task tracker address.
*/
private String taskTrackerAddress;
// 启动参数
/**
* Param string that is passed to an instance when it is initialized.
*/
private String instanceParams;
// MR或BD任务专用
/**
* Task detail, used by MapReduce or Broadcast tasks.
*/
private TaskDetail taskDetail;
// 秒级任务专用
/**
* Sub instance details, used by frequent tasks.
*/
private List<SubInstanceDetail> subInstanceDetails;
// 重试次数
/**
* Running times.
*/
private Long runningTimes;
// 扩展字段中间件升级不易最好不要再改 common 包了...否则 server worker 版本不兼容
/**
* Extended fields. Middlewares are not supposed to update frequently.
* Changes in PowerJob-common may lead to incompatible versions.
* PowerJob-common packages should not be modified if not necessary.
*/
private String extra;
// 秒级任务的 extra -> List<SubInstanceDetail>
/**
* Extra info for frequent tasks, return List<SubInstanceDetail>.
*/
@Data
@NoArgsConstructor
public static class SubInstanceDetail implements OmsSerializable {
@ -53,7 +82,9 @@ public class InstanceDetail implements OmsSerializable {
private int status;
}
// MapReduce Broadcast 任务的 extra ->
/**
* Extra info of {@code MapReduce} or {@code Broadcast} type of tasks.
*/
@Data
@NoArgsConstructor
public static class TaskDetail implements OmsSerializable {

View File

@ -6,7 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 任务实例日志对象
* Log instance model.
*
* @author tjq
* @since 2020/4/21
@ -16,13 +16,21 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class InstanceLogContent implements OmsSerializable {
// 实例ID
/**
* Id of instance.
*/
private long instanceId;
// 日志提交时间
/**
* Submitted time of the log.
*/
private long logTime;
// 级别
/**
* Level of the log.
*/
private int logLevel;
// 日志内容
/**
* Content of the log.
*/
private String logContent;
}

View File

@ -13,8 +13,7 @@ import java.io.Serializable;
import java.util.List;
/**
* Point & Edge DAG 表示法
* + 线易于表达和传播
* Points & edges for DAG, making it easier to describe or transfer.
*
* @author tjq
* @since 2020/5/26
@ -23,11 +22,18 @@ import java.util.List;
@NoArgsConstructor
public class PEWorkflowDAG implements Serializable {
// DAG 点线表示法
/**
* Nodes of DAG diagram.
*/
private List<Node> nodes;
/**
* Edges of DAG diagram.
*/
private List<Edge> edges;
//
/**
* Point.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ -35,7 +41,9 @@ public class PEWorkflowDAG implements Serializable {
private Long jobId;
private String jobName;
// 运行时参数图定义不需要
/**
* Instance running param, which is not required by DAG.
*/
@JsonSerialize(using= ToStringSerializer.class)
private Long instanceId;
private Integer status;
@ -47,7 +55,9 @@ public class PEWorkflowDAG implements Serializable {
}
}
// jobId -> jobId
/**
* Edge formed by two job ids.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor

View File

@ -4,7 +4,7 @@ import com.github.kfcfans.powerjob.common.OmsSerializable;
import lombok.Data;
/**
* 系统指标
* Class for system metrics.
*
* @author tjq
* @since 2020/3/25
@ -12,49 +12,77 @@ import lombok.Data;
@Data
public class SystemMetrics implements OmsSerializable, Comparable<SystemMetrics> {
// CPU核心数量
/**
* CPU processor num.
*/
private int cpuProcessors;
// CPU负载负载 使用率 是两个完全不同的概念Java 无法获取 CPU 使用率只能获取负载
/**
* Percent of CPU load.
*/
private double cpuLoad;
// 内存单位 GB
/**
* Memory that is used by JVM, in GB.
*/
private double jvmUsedMemory;
/**
* Max memory that JVM can use, in GB.
*/
private double jvmMaxMemory;
// 内存占用0.X非百分比
/**
* Ratio of memory that JVM uses to total memory, 0.X,
* the value is between 0 and 1.
*/
private double jvmMemoryUsage;
// 磁盘单位 GB
/**
* Total used disk space, in GB.
*/
private double diskUsed;
/**
* Total disk space, in GB.
*/
private double diskTotal;
// 磁盘占用0.X非百分比
/**
* Used disk ratio.
*/
private double diskUsage;
// 缓存分数
/**
* Score of cache.
*/
private int score;
/**
* Override compareTo.
*
* @param that the metrics that is to be compared with current.
* @return {@code int}
*/
@Override
public int compareTo(SystemMetrics that) {
// 降序排列
// Sort by metrics in descending order.
return that.calculateScore() - this.calculateScore();
}
/**
* 计算得分情况内存 & CPU (磁盘不参与计算)
* @return 得分情况
* Calculate score, based on CPU and memory info.
*
* @return score
*/
public int calculateScore() {
if (score > 0) {
return score;
}
if (score > 0) {
return score;
}
// 对于 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;
// Memory is vital to TaskTracker, so we set the multiplier factor as 2.
double memScore = (jvmMaxMemory - jvmUsedMemory) * 2;
// Calculate the remaining load of CPU. Multiplier is set as 1.
double cpuScore = cpuProcessors - cpuLoad;
// Windows can not fetch CPU load, set cpuScore as 1.
if (cpuScore > cpuProcessors) {
cpuScore = 1;
}
score = (int) (memScore + cpuScore);
@ -62,11 +90,12 @@ public class SystemMetrics implements OmsSerializable, Comparable<SystemMetrics>
}
/**
* 该机器是否可用
* @param minCPUCores 判断标准之最低可用CPU核心数量
* Judge if the machine is available.
*
* @param minCPUCores Minimum available CPU cores.
* @param minMemorySpace 判断标准之最低可用内存
* @param minDiskSpace 判断标准之最低可用磁盘空间
* @return 是否可用
* @param minDiskSpace Minimum disk space 判断标准之最低可用磁盘空间
* @return {@code boolean} whether the machine is available.
*/
public boolean available(double minCPUCores, double minMemorySpace, double minDiskSpace) {
@ -77,7 +106,8 @@ public class SystemMetrics implements OmsSerializable, Comparable<SystemMetrics>
return false;
}
// cpuLoad 为负数代表无法获取不判断等于 0 为最理想情况CPU 空载不需要判断
// Negative number means being unable to fetch CPU info, return true.
// 0 indicates the CPU is free, which is the optimal condition.
if (cpuLoad <= 0 || minCPUCores <= 0) {
return true;
}

View File

@ -9,7 +9,7 @@ import lombok.Data;
import java.util.List;
/**
* 创建/修改 JobInfo 请求
* Save or modify {@link com.github.kfcfans.powerjob.common.response.JobInfoDTO}
*
* @author tjq
* @since 2020/3/30
@ -17,68 +17,122 @@ import java.util.List;
@Data
public class SaveJobInfoRequest {
// 任务IDjobIdnull -> 插入否则为更新
/**
* id of the job. set null to save or non-null to update the job.
*/
private Long id;
/* ************************** 任务基本信息 ************************** */
// 任务名称
/* ************************** Base info of related job. ************************** */
/**
* Name of the job.
*/
private String jobName;
// 任务描述
/**
* Description of the job.
*/
private String jobDescription;
// 任务所属的应用IDClient无需填写该参数自动填充
/**
* Related id of the application. There is not need to set this property
* in PowerJob-client, as it would be set automatically.
*/
private Long appId;
// 任务自带的参数
/**
* Params that these jobs carry with when they are created.
*/
private String jobParams;
/* ************************** 定时参数 ************************** */
// 时间表达式类型CRON/API/FIX_RATE/FIX_DELAY
/* ************************** Timing param. ************************** */
/**
* Time expression type.
*/
private TimeExpressionType timeExpressionType;
// 时间表达式CRON/NULL/LONG/LONG
/**
* Time expression.
*/
private String timeExpression;
/* ************************** 执行方式 ************************** */
// 执行类型单机/广播/MR
/* ************************** Execution type. ************************** */
/**
* Execution type, {@code standalone}, {@code broadcast} or {@code Map/MapReduce}
*/
private ExecuteType executeType;
// 执行器类型Java/Shell
/**
* Processor type, {@code Java}, {@code Python} or {@code Shell}.
*/
private ProcessorType processorType;
// 执行器信息
/**
* Processor info.
*/
private String processorInfo;
/* ************************** 运行时配置 ************************** */
// 最大同时运行任务数0 代表不限
/* ************************** Running instance setting. ************************** */
/**
* Maximum instance setting num. {@code 0} means there is no restriction.
*/
private Integer maxInstanceNum = 0;
// 并发度同时执行的线程数量
/**
* Concurrency setting. Number of threads that run simultaneously.
*/
private Integer concurrency = 5;
// 任务整体超时时间
/**
* Max instance running time setting. {@code 0L} means there is no restriction.
*/
private Long instanceTimeLimit = 0L;
/* ************************** 重试配置 ************************** */
/* ************************** Retrial setting. ************************** */
/**
* Instance retry number setting.
*/
private Integer instanceRetryNum = 0;
/**
* Task retry number setting.
*/
private Integer taskRetryNum = 0;
/* ************************** 繁忙机器配置 ************************** */
// 最低CPU核心数量0代表不限
/* ************************** Busy Machine setting. ************************** */
/**
* Minimum CPU required. {@code 0} means there is no restriction.
*/
private double minCpuCores = 0;
// 最低内存空间单位 GB0代表不限
/**
* Minimum memory required, in GB.
*/
private double minMemorySpace = 0;
// 最低磁盘空间单位 GB0代表不限
/**
* Minimum disk space, in GB. {@code 0} means there is no restriction.
*/
private double minDiskSpace = 0;
// 1 正常运行2 停止不再调度
/**
* {@code 1} indicates that the worker node is running well,
* {@code 2} indicates that the worker node has been inactive
* and future tasks will not be assigned to the node.
*/
private boolean enable = true;
/* ************************** 集群配置 ************************** */
// 指定机器运行空代表不限非空则只会使用其中的机器运行多值逗号分割
/* ************************** PowerJob-worker cluster property ************************** */
/**
* Designated PowerJob-worker nodes. Blank value indicates that there is
* no limit. Non-blank value means to run the corresponding machine(s) only.
*/
private String designatedWorkers;
// 最大机器数量
/**
* Max count of PowerJob-worker nodes.
*/
private Integer maxWorkerCount = 0;
// 报警用户ID列表
/**
* The id list of the users that need to be notified.
*/
private List<Long> notifyUserIds;
/**
* Check non-null properties.
*/
public void valid() {
CommonUtils.requireNonNull(jobName, "jobName can't be empty");
CommonUtils.requireNonNull(appId, "appId can't be empty");

View File

@ -17,7 +17,7 @@
<swagger.version>2.9.2</swagger.version>
<springboot.version>2.3.4.RELEASE</springboot.version>
<powerjob.common.version>3.4.2</powerjob.common.version>
<!-- 数据库驱动版本使用的是spring-boot-dependencies管理的版本 -->
<!-- MySQL version that corresponds to spring-boot-dependencies version. -->
<mysql.version>8.0.19</mysql.version>
<ojdbc.version>19.7.0.0</ojdbc.version>
<mssql-jdbc.version>7.4.1.jre8</mssql-jdbc.version>
@ -32,7 +32,7 @@
<fastjson.version>1.2.68</fastjson.version>
<dingding.version>1.0.1</dingding.version>
<!-- 部署时跳过该module -->
<!-- Skip this module when deploying. -->
<maven.deploy.skip>true</maven.deploy.skip>
</properties>
@ -136,42 +136,42 @@
<scope>test</scope>
</dependency>
<!-- zip4jZip操作 -->
<!-- zip4j(Zip support) -->
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>${zip4j.version}</version>
</dependency>
<!-- jGitGit操作 -->
<!-- jGit(Git support) -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>${jgit.version}</version>
</dependency>
<!-- 时间工具类NTP时间同步 -->
<!-- Time tools(NTP support) -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons.net.version}</version>
</dependency>
<!-- Maven Invoker(编译 maven 项目) -->
<!-- Maven Invoker(used for maven compilation) -->
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>${mvn.invoker.version}</version>
</dependency>
<!-- fastJson(为了序列化 DAG 引用引入) -->
<!-- fastJson(used for serialization of DAG) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 钉钉 报警通知 -->
<!-- DingTalk SDK. -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
@ -185,7 +185,6 @@
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
@ -201,7 +200,7 @@
</dependencies>
<!-- SpringBoot专用的打包插件 -->
<!-- SpringBoot maven plugin -->
<build>
<plugins>
<plugin>
@ -215,7 +214,7 @@
<execution>
<goals>
<goal>build-info</goal>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>

View File

@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* SpringBoot 启动入口
* SpringBoot entry.
*
* @author tjq
* @since 2020/3/29
@ -26,16 +26,16 @@ public class OhMyApplication {
public static void main(String[] args) {
// 完成前置工作
// Print tips before starting.
pre();
// 先启动 ActorSystem
// Init ActorSystem
OhMyServer.init();
// 再启动SpringBoot
// Start SpringBoot application.
try {
SpringApplication.run(OhMyApplication.class, args);
}catch (Throwable t) {
} catch (Throwable t) {
log.error(TIPS);
throw t;
}

View File

@ -1,7 +1,7 @@
oms.env=DAILY
logging.config=classpath:logback-dev.xml
####### 外部数据库配置(需要用户更改为自己的数据库配置) #######
####### Database properties(Configure according to the the environment) #######
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&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
@ -9,11 +9,12 @@ spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
####### mongoDB配置非核心依赖通过配置 oms.mongodb.enable=false 来关闭 #######
####### MongoDB properties(Non-core configuration properties) #######
####### configure oms.mongodb.enable=false to disable mongodb #######
oms.mongodb.enable=true
spring.data.mongodb.uri=mongodb+srv://zqq:No1Bug2Please3!@cluster0.wie54.gcp.mongodb.net/powerjob_daily?retryWrites=true&w=majority
####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
####### Email properties(Comment out the mail properties if you do not have needs) #######
spring.mail.host=smtp.163.com
spring.mail.username=zqq@163.com
spring.mail.password=GOFZPNARMVKCGONV
@ -21,18 +22,19 @@ spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
####### 钉钉报警配置(不需要钉钉报警可以删除以下配置来避免报错) #######
####### DingTalk properties(Comment out the DingTalk properties if you do not have needs) #######
oms.alarm.ding.app-key=dingauqwkvxxnqskknfv
oms.alarm.ding.app-secret=XWrEPdAZMPgJeFtHuL0LH73LRj-74umF2_0BFcoXMfvnX0pCQvt0rpb1JOJU_HLl
oms.alarm.ding.agent-id=847044348
####### 资源清理配置 #######
####### Resource cleaning properties #######
oms.instanceinfo.retention=1
oms.container.retention.local=1
oms.container.retention.remote=-1
####### 缓存配置 #######
####### Cache properties #######
oms.instance.metadata.cache.size=1024
####### 精确获取 server 的百分比0100100代表每次 worker 获取 server 都会进行完整的探活流程,不存在脑裂问题,但有性能开销 #######
####### Threshold in fetching server(0~100). 100 means full detection of server, in which #######
####### split-brain could be avoided while performance overhead would increase. #######
oms.accurate.select.server.percentage = 50

View File

@ -1,7 +1,7 @@
oms.env=PRE
logging.config=classpath:logback-product.xml
####### 数据库配置 #######
####### Database properties(Configure according to the the environment) #######
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&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
@ -9,11 +9,12 @@ spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
####### mongoDB配置非核心依赖通过配置 oms.mongodb.enable=false 来关闭 #######
####### MongoDB properties(Non-core configuration properties) #######
####### configure oms.mongodb.enable=false to disable mongodb #######
oms.mongodb.enable=true
spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-pre
####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
####### Email properties(Comment out the mail properties if you do not have needs) #######
spring.mail.host=smtp.qq.com
spring.mail.username=zqq
spring.mail.password=qqz
@ -21,18 +22,19 @@ spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
####### 钉钉报警配置(不需要钉钉报警可以删除以下配置来避免报错) #######
####### DingTalk properties(Comment out the DingTalk properties if you do not have needs) #######
oms.alarm.ding.app-key=dingauqwkvxxnqskknfv
oms.alarm.ding.app-secret=XWrEPdAZMPgJeFtHuL0LH73LRj-74umF2_0BFcoXMfvnX0pCQvt0rpb1JOJU_HLl
oms.alarm.ding.agent-id=847044348
####### 资源清理配置 #######
####### Resource cleaning properties #######
oms.instanceinfo.retention=3
oms.container.retention.local=3
oms.container.retention.remote=-1
####### 缓存配置 #######
####### Cache properties #######
oms.instance.metadata.cache.size=1024
####### 精确获取 server 的百分比0100100代表每次 worker 获取 server 都会进行完整的探活流程,不存在脑裂问题,但有性能开销 #######
####### Threshold in fetching server(0~100). 100 means full detection of server, in which #######
####### split-brain could be avoided while performance overhead would increase. #######
oms.accurate.select.server.percentage = 50

View File

@ -1,7 +1,7 @@
oms.env=PRODUCT
logging.config=classpath:logback-product.xml
####### 数据库配置 #######
####### Database properties(Configure according to the the environment) #######
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&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
@ -9,11 +9,12 @@ spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
####### mongoDB配置非核心依赖通过配置 oms.mongodb.enable=false 来关闭 #######
####### MongoDB properties(Non-core configuration properties) #######
####### configure oms.mongodb.enable=false to disable mongodb #######
oms.mongodb.enable=true
spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-product
####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
####### Email properties(Comment out the mail properties if you do not have needs) #######
spring.mail.host=smtp.qq.com
spring.mail.username=zqq
spring.mail.password=qqz
@ -21,18 +22,19 @@ spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
####### 钉钉报警配置(不需要钉钉报警可以删除以下配置来避免报错) #######
####### DingTalk properties(Comment out the DingTalk properties if you do not have needs) #######
oms.alarm.ding.app-key=
oms.alarm.ding.app-secret=
oms.alarm.ding.agent-id=
####### 资源清理配置 #######
####### Resource cleaning properties #######
oms.instanceinfo.retention=7
oms.container.retention.local=7
oms.container.retention.remote=-1
####### 缓存配置 #######
####### Cache properties #######
oms.instance.metadata.cache.size=2048
####### 精确获取 server 的百分比0100100代表每次 worker 获取 server 都会进行完整的探活流程,不存在脑裂问题,但有性能开销 #######
####### Threshold in fetching server(0~100). 100 means full detection of server, in which #######
####### split-brain could be avoided while performance overhead would increase. #######
oms.accurate.select.server.percentage = 50

View File

@ -1,4 +1,4 @@
# http 服务端口
# Http server port
server.port=7700
spring.profiles.active=daily
@ -7,14 +7,14 @@ spring.jpa.open-in-view=false
spring.data.mongodb.repositories.type=none
logging.level.org.mongodb=warn
# 文件上传配置
# Configuration for uploading files.
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.max-file-size=209715200
spring.servlet.multipart.max-request-size=209715200
###### PowerJob 自身配置(该配置只允许存在于 application.properties 文件中) ######
# akka ActorSystem 服务端口
###### PowerJob self-owned configuration (The following properties should exist in application.properties only). ######
# Akka ActorSystem port.
oms.akka.port=10086
# 表前缀(默认无表前缀,有需求直接填入表前缀即可,比如 pj_
# Prefix for all tables. Default empty string. Config if you have needs, i.e. pj_
oms.table-prefix=

View File

@ -1,18 +1,18 @@
<?xml version="1.0"?>
<!-- 本地调试专用,所有日志都从 console 输出-->
<!-- Configuration for local environment, all logs would print in console. -->
<configuration>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<!-- Configure color for logs. -->
<!-- Classes for rendering color. -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<!-- Color log pattern. -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{20}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- Console 输出设置 -->
<!-- Configuration for console output. -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
@ -20,13 +20,13 @@
</encoder>
</appender>
<!-- 定时调度信息控制台就不输出了,看着就乱 -->
<!-- Quit timing logs, which seems disordered. -->
<logger name="com.github.kfcfans.powerjob.server.service.timing" level="WARN" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.github.kfcfans.powerjob" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="CONSOLE"/>
</logger>
<root level="INFO">

View File

@ -1,20 +1,20 @@
<?xml version="1.0"?>
<!-- 生产环境日志 -->
<!-- Configuration for production environment. -->
<configuration>
<!--默认配置-->
<!-- Default configuration. -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!--配置控制台(Console)-->
<!-- Configuration for console. -->
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--
日志路径,注意权限问题,否则无法打印日志。
大坑记录:`~/logs`不会在用户目录下创建文件夹,而是在项目目录下创建名为~的文件夹
-->
Log path, pay attention to permission, logs may be unable to generate.
Bug recording: Setting `~/logs`, is unable to create folder in user home directory,
a folder with the name ~ is created in project folder.
-->
<property name="LOG_PATH" value="${user.home}/powerjob-server/logs"/>
<!-- 系统所有异常日志ERROR双写 start -->
<!-- Configuration for ERROR logs. All error logs will write twice. -->
<appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/powerjob-server-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@ -31,9 +31,9 @@
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统所有异常日志ERROR双写 end -->
<!-- End of configuration for ERROR logs. -->
<!-- web 访问日志 start -->
<!-- Configuration for Web services. -->
<appender name="WEB_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/powerjob-server-web.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@ -49,9 +49,9 @@
<logger name="WEB_LOG" level="INFO" additivity="false">
<appender-ref ref="WEB_LOG_APPENDER"/>
</logger>
<!-- web 访问日志 日志 end -->
<!-- End of configuration for Web services. -->
<!-- 系统主日志 start -->
<!-- Configuration for system logs. -->
<appender name="DEFAULT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/powerjob-server-application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@ -64,7 +64,7 @@
</encoder>
<append>true</append>
</appender>
<!-- 系统主日志 日志 end -->
<!-- End of configuration for system logs. -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>

View File

@ -50,7 +50,6 @@
</dependencies>
<!-- 谁说SpringBoot的打包插件只能给SpringBoot用的省的我写一堆配置还有BUG... -->
<build>
<plugins>
<plugin>
@ -63,7 +62,7 @@
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>

View File

@ -1,15 +1,13 @@
server.port=8081
spring.jpa.open-in-view=false
########### powerjob-worker 配置(老配置 powerjob.xxx 即将废弃,请使用 powerjob.worker.xxx ###########
# akka 工作端口,可选,默认 27777
########### PowerJob-worker properties. ###########
# Akka port, default is 27777
powerjob.worker.akka-port=27777
# 接入应用名称,用于分组隔离,推荐填写 本 Java 项目名称
# Application name, used for grouping applications. Recommend to set the same value as project name.
powerjob.worker.app-name=powerjob-agent-test
# 调度服务器地址IP:Port 或 域名,多值逗号分隔
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
# 持久化方式,可选,默认 disk
# Store strategy of H2 database. disk or memory. Default value is disk.
powerjob.worker.store-strategy=disk
# 返回值最大长度,默认 8096
# Max length of result. Results that are longer than the value will be truncated.
powerjob.worker.max-result-length=4096

View File

@ -16,7 +16,7 @@ import java.util.Arrays;
import java.util.List;
/**
* PowerJob 自动装配
* Auto configuration class for PowerJob-worker.
*
* @author songyinyin
* @since 2020/7/26 16:37
@ -32,30 +32,46 @@ public class PowerJobAutoConfiguration {
PowerJobProperties.Worker worker = properties.getWorker();
// 服务器HTTP地址端口号为 server.port而不是 ActorSystem port请勿添加任何前缀http://
/*
* Address of PowerJob-server node(s). Do not mistake for ActorSystem port. Do not add
* any prefix, i.e. http://.
*/
CommonUtils.requireNonNull(worker.getServerAddress(), "serverAddress can't be empty!");
List<String> serverAddress = Arrays.asList(worker.getServerAddress().split(","));
// 1. 创建配置文件
/*
* Create OhMyConfig object for setting properties.
*/
OhMyConfig config = new OhMyConfig();
// 端口配置支持随机端口
/*
* Configuration of worker port. Random port is enabled when port is set with non-positive number.
*/
int port = worker.getAkkaPort();
if (port <= 0) {
port = NetUtils.getRandomPort();
}
config.setPort(port);
// appName需要提前在控制台注册否则启动报错
/*
* appName, name of the application. Applications should be registered in advance to prevent
* error. This property should be the same with what you entered for appName when getting
* registered.
*/
config.setAppName(worker.getAppName());
config.setServerAddress(serverAddress);
// 如果没有大型 Map/MapReduce 的需求建议使用内存来加速计算
// 有大型 Map/MapReduce 需求可能产生大量子任务Task的场景请使用 DISK否则妥妥的 OutOfMemory
/*
* For non-Map/MapReduce tasks, {@code memory} is recommended for speeding up calculation.
* Map/MapReduce tasks may produce batches of subtasks, which could lead to OutOfMemory
* exception or error, {@code disk} should be applied.
*/
config.setStoreStrategy(worker.getStoreStrategy());
// 启动测试模式true情况下不再尝试连接 server 并验证appName
/*
* When enabledTestMode is set as true, PowerJob-worker no longer connects to PowerJob-server
* or validate appName.
*/
config.setEnableTestMode(worker.isEnableTestMode());
// 2. 创建 Worker 对象设置配置文件
/*
* Create OhMyWorker object and set properties.
*/
OhMyWorker ohMyWorker = new OhMyWorker();
ohMyWorker.setConfig(config);
return ohMyWorker;

View File

@ -9,7 +9,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
/**
* PowerJob 配置项
* PowerJob properties configuration class.
*
* @author songyinyin
* @since 2020/7/26 16:37
@ -90,37 +90,49 @@ public class PowerJobProperties {
}
/**
* 客户端 配置项
* Powerjob worker configuration properties.
*/
@Setter
@Getter
public static class Worker {
/**
* 应用名称需要提前在控制台注册否则启动报错
* Name of application, String type. Total length of this property should be no more than 255
* characters. This is one of the required properties when registering a new application. This
* property should be assigned with the same value as what you entered for the appName.
*/
private String appName;
/**
* 启动 akka 端口
* Akka port of Powerjob-worker, optional value. Default value of this property is 27777.
* If multiple PowerJob-worker nodes were deployed, different, unique ports should be assigned.
*/
private int akkaPort = RemoteConstant.DEFAULT_WORKER_PORT;
/**
* 调度服务器地址ip:port 域名多个用英文逗号分隔
* Address(es) of Powerjob-server node(s). Ip:port or domain.
* Example of single Powerjob-server node:
* <p>
* 127.0.0.1:7700
* </p>
* Example of Powerjob-server cluster:
* <p>
* 192.168.0.10:7700,192.168.0.11:7700,192.168.0.12:7700
* </p>
*/
private String serverAddress;
/**
* 本地持久化方式默认使用磁盘
* Local store strategy for H2 database. {@code disk} or {@code memory}.
*/
private StoreStrategy storeStrategy = StoreStrategy.DISK;
/**
* 最大返回值长度超过会被截断
* {@link ProcessResult}#msg 的最大长度
* Max length of response result. Result that is longer than the value will be truncated.
* {@link ProcessResult} max length for #msg
*/
private int maxResultLength = 8096;
/**
* 启动测试模式true情况下不再尝试连接 server 并验证appName
* true -> 用于本地写单元测试调试 false -> 默认值标准模式
* If test mode is set as true, Powerjob-worker no longer connects to the server or validates appName.
* Test mode is used for conditions that your worker does not need to run the codes, i.e. when you
* write junit tests in local environment. {@code true} means test mode is enabled. {@code false} means
* normal mode is applied.
*/
private boolean enableTestMode = false;
}

View File

@ -16,39 +16,39 @@
{
"name": "powerjob.worker.akka-port",
"type": "java.lang.Integer",
"description": "启动 akka 端口",
"description": "Akka port of PowerJob-worker",
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties$Worker"
},
{
"name": "powerjob.worker.app-name",
"type": "java.lang.String",
"description": "应用名称,需要提前在控制台注册,否则启动报错",
"description": "Name of application. Register in PowerJob-console to prevent error.",
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties$Worker"
},
{
"name": "powerjob.worker.enable-test-mode",
"type": "java.lang.Boolean",
"description": "启动测试模式true情况下不再尝试连接 server 并验证appName。 true -> 用于本地写单元测试调试; false -> 默认值,标准模式",
"description": "Whether to enable test mode. In test mode, worker will not connect to server.",
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties$Worker",
"defaultValue": false
},
{
"name": "powerjob.worker.max-result-length",
"type": "java.lang.Integer",
"description": "最大返回值长度,超过会被截断 {@link ProcessResult}#msg 的最大长度",
"description": "Max length for {@link ProcessResult}#msg, result longer than this property will be truncated.",
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties$Worker",
"defaultValue": 8096
},
{
"name": "powerjob.worker.server-address",
"type": "java.lang.String",
"description": "调度服务器地址ip:port 或 域名,多个用英文逗号分隔",
"description": "PowerJob-server node(s) address. Ip:port or domain, multiple addresses should be separated with comma",
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties$Worker"
},
{
"name": "powerjob.worker.store-strategy",
"type": "com.github.kfcfans.powerjob.worker.common.constants.StoreStrategy",
"description": "本地持久化方式,默认使用磁盘",
"description": "Local store strategy, disk or memory",
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties$Worker"
}
],

View File

@ -1,7 +1,7 @@
package com.github.kfcfans.powerjob.worker.autoconfigure;
import com.github.kfcfans.powerjob.worker.OhMyWorker;
import org.junit.Assert;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@ -16,7 +16,7 @@ class PowerJobAutoConfigurationTest {
void testAutoConfiguration() {
ConfigurableApplicationContext run = SpringApplication.run(PowerJobAutoConfigurationTest.class);
OhMyWorker worker = run.getBean(OhMyWorker.class);
Assert.assertNotNull(worker);
Assertions.assertNotNull(worker);
}
}

View File

@ -1,2 +1 @@
powerjob.enable-test-mode=true