mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
[release] v3.3.2
This commit is contained in:
commit
7c7a7f6754
19
README.md
19
README.md
@ -26,7 +26,7 @@ PowerJob(原OhMyScheduler)是全新一代分布式调度与计算框架,
|
||||
* 有定时执行需求的业务场景:如每天凌晨全量同步数据、生成业务报表等。
|
||||
* 有需要全部机器一同执行的业务场景:如使用广播执行模式清理集群日志。
|
||||
* 有需要分布式处理的业务场景:比如需要更新一大批数据,单机执行耗时非常长,可以使用Map/MapReduce处理器完成任务的分发,调动整个集群加速计算。
|
||||
* 有需要延迟执行某些任务的业务场景:比如订单过期处理等。
|
||||
* 有需要**延迟执行**某些任务的业务场景:比如订单过期处理等。
|
||||
|
||||
### 设计目标
|
||||
PowerJob 的设计目标为企业级的分布式任务调度平台,即成为公司内部的**任务调度中间件**。整个公司统一部署调度中心 powerjob-server,旗下所有业务线应用只需要依赖 `powerjob-worker` 即可接入调度中心获取任务调度与分布式计算能力。
|
||||
@ -43,7 +43,7 @@ PowerJob 的设计目标为企业级的分布式任务调度平台,即成为
|
||||
| -------------- | ------------------------ | ---------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------ |
|
||||
| 定时类型 | CRON | CRON | CRON、固定频率、固定延迟、OpenAPI | **CRON、固定频率、固定延迟、OpenAPI** |
|
||||
| 任务类型 | 内置Java | 内置Java、GLUE Java、Shell、Python等脚本 | 内置Java、外置Java(FatJar)、Shell、Python等脚本 | **内置Java、外置Java(容器)、Shell、Python等脚本** |
|
||||
| 分布式任务 | 无 | 静态分片 | MapReduce动态分片 | **MapReduce动态分片** |
|
||||
| 分布式计算 | 无 | 静态分片 | MapReduce动态分片 | **MapReduce动态分片** |
|
||||
| 在线任务治理 | 不支持 | 支持 | 支持 | **支持** |
|
||||
| 日志白屏化 | 不支持 | 支持 | 不支持 | **支持** |
|
||||
| 调度方式及性能 | 基于数据库锁,有性能瓶颈 | 基于数据库锁,有性能瓶颈 | 不详 | **无锁化设计,性能强劲无上限** |
|
||||
@ -52,20 +52,21 @@ PowerJob 的设计目标为企业级的分布式任务调度平台,即成为
|
||||
| DAG工作流 | 不支持 | 不支持 | 支持 | **支持** |
|
||||
|
||||
|
||||
# 文档
|
||||
# 官方文档
|
||||
**[中文文档](https://www.yuque.com/powerjob/guidence/ztn4i5)**
|
||||
|
||||
**[Document](https://www.yuque.com/powerjob/en/xrdoqw)**
|
||||
|
||||
PS:感谢文档翻译平台[breword](https://www.breword.com/)对本项目英文文档翻译做出的巨大贡献!
|
||||
|
||||
# 参考
|
||||
>Alibaba SchedulerX 2.0
|
||||
# 接入登记
|
||||
[点击进行接入登记,为 PowerJob 的发展贡献自己的力量!](https://github.com/KFCFans/PowerJob/issues/6)
|
||||
|
||||
* [Akka 框架](https://yq.aliyun.com/articles/709946?spm=a2c4e.11153959.teamhomeleft.67.6a0560c9bZEnZq):不得不说,akka-remote简化了相当大一部分的网络通讯代码。
|
||||
* [执行器架构设计](https://yq.aliyun.com/articles/704121?spm=a2c4e.11153959.teamhomeleft.97.371960c9qhB1mB):这篇文章反而不太认同,感觉我个人的设计更符合Yarn的“架构”。
|
||||
* [MapReduce模型](https://yq.aliyun.com/articles/706820?spm=a2c4e.11153959.teamhomeleft.83.6a0560c9bZEnZq):想法很Cool,大数据处理框架都是处理器向数据移动,但对于传统Java应用来说,数据向处理器移动也未尝不可,这样还能使框架的实现变得简单很多。
|
||||
* [广播执行](https://yq.aliyun.com/articles/716203?spm=a2c4e.11153959.teamhomeleft.40.371960c9qhB1mB):运行清理日志脚本什么的,也太实用了8~
|
||||
ღ( ´・ᴗ・\` )ღ 感谢以下接入用户的大力支持 ღ( ´・ᴗ・\` )ღ
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/KFCFans/PowerJob/master/others/images/user.png" alt="PowerJob User" title="PowerJob User"/>
|
||||
</p>
|
||||
|
||||
# 其他
|
||||
* 开源许可证:Apache License, Version 2.0
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 526 KiB After Width: | Height: | Size: 562 KiB |
@ -10,13 +10,13 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>powerjob-client</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<junit.version>5.6.1</junit.version>
|
||||
<fastjson.version>1.2.68</fastjson.version>
|
||||
<powerjob.common.version>3.3.1</powerjob.common.version>
|
||||
<powerjob.common.version>3.3.2</powerjob.common.version>
|
||||
|
||||
<mvn.shade.plugin.version>3.2.4</mvn.shade.plugin.version>
|
||||
</properties>
|
||||
|
@ -2,13 +2,14 @@ package com.github.kfcfans.powerjob.client;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.github.kfcfans.powerjob.common.InstanceStatus;
|
||||
import com.github.kfcfans.powerjob.common.PowerJobException;
|
||||
import com.github.kfcfans.powerjob.common.OpenAPIConstant;
|
||||
import com.github.kfcfans.powerjob.common.PowerJobException;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveJobInfoRequest;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveWorkflowRequest;
|
||||
import com.github.kfcfans.powerjob.common.response.*;
|
||||
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.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.FormBody;
|
||||
@ -20,6 +21,8 @@ import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static com.github.kfcfans.powerjob.client.TypeStore.*;
|
||||
|
||||
/**
|
||||
* OpenAPI 客户端
|
||||
*
|
||||
@ -27,7 +30,6 @@ import java.util.Objects;
|
||||
* @since 2020/4/15
|
||||
*/
|
||||
@Slf4j
|
||||
@SuppressWarnings("rawtypes, unchecked")
|
||||
public class OhMyClient {
|
||||
|
||||
private Long appId;
|
||||
@ -62,9 +64,9 @@ public class OhMyClient {
|
||||
try {
|
||||
String result = assertApp(appName, password, url);
|
||||
if (StringUtils.isNotEmpty(result)) {
|
||||
ResultDTO resultDTO = JSONObject.parseObject(result, ResultDTO.class);
|
||||
ResultDTO<Long> resultDTO = JSONObject.parseObject(result, LONG_RESULT_TYPE);
|
||||
if (resultDTO.isSuccess()) {
|
||||
appId = Long.parseLong(resultDTO.getData().toString());
|
||||
appId = resultDTO.getData();
|
||||
currentAddress = addr;
|
||||
break;
|
||||
}else {
|
||||
@ -101,75 +103,75 @@ public class OhMyClient {
|
||||
* 保存任务(包括创建与修改)
|
||||
* @param request 任务详细参数
|
||||
* @return 创建的任务ID
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Long> saveJob(SaveJobInfoRequest request) throws Exception {
|
||||
public ResultDTO<Long> saveJob(SaveJobInfoRequest request) throws PowerJobException {
|
||||
|
||||
request.setAppId(appId);
|
||||
MediaType jsonType = MediaType.parse("application/json; charset=utf-8");
|
||||
String json = JSONObject.toJSONString(request);
|
||||
String post = postHA(OpenAPIConstant.SAVE_JOB, RequestBody.create(jsonType, json));
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, LONG_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据 jobId 查询任务信息
|
||||
* @param jobId 任务ID
|
||||
* @return 任务详细信息
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<JobInfoDTO> fetchJob(Long jobId) throws Exception {
|
||||
public ResultDTO<JobInfoDTO> fetchJob(Long jobId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("jobId", jobId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.FETCH_JOB, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, JOB_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用某个任务
|
||||
* @param jobId 任务ID
|
||||
* @return 标准返回对象
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> disableJob(Long jobId) throws Exception {
|
||||
public ResultDTO<Void> disableJob(Long jobId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("jobId", jobId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.DISABLE_JOB, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用某个任务
|
||||
* @param jobId 任务ID
|
||||
* @return 标准返回对象
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> enableJob(Long jobId) throws Exception {
|
||||
public ResultDTO<Void> enableJob(Long jobId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("jobId", jobId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.ENABLE_JOB, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除某个任务
|
||||
* @param jobId 任务ID
|
||||
* @return 标准返回对象
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> deleteJob(Long jobId) throws Exception {
|
||||
public ResultDTO<Void> deleteJob(Long jobId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("jobId", jobId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.DELETE_JOB, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -178,9 +180,9 @@ public class OhMyClient {
|
||||
* @param instanceParams 任务实例的参数
|
||||
* @param delayMS 延迟时间,单位毫秒
|
||||
* @return 任务实例ID(instanceId)
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Long> runJob(Long jobId, String instanceParams, long delayMS) throws Exception {
|
||||
public ResultDTO<Long> runJob(Long jobId, String instanceParams, long delayMS) throws PowerJobException {
|
||||
FormBody.Builder builder = new FormBody.Builder()
|
||||
.add("jobId", jobId.toString())
|
||||
.add("appId", appId.toString())
|
||||
@ -190,9 +192,9 @@ public class OhMyClient {
|
||||
builder.add("instanceParams", instanceParams);
|
||||
}
|
||||
String post = postHA(OpenAPIConstant.RUN_JOB, builder.build());
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, LONG_RESULT_TYPE);
|
||||
}
|
||||
public ResultDTO<Long> runJob(Long jobId) throws Exception {
|
||||
public ResultDTO<Long> runJob(Long jobId) throws PowerJobException {
|
||||
return runJob(jobId, null, 0);
|
||||
}
|
||||
|
||||
@ -201,15 +203,15 @@ public class OhMyClient {
|
||||
* 停止应用实例
|
||||
* @param instanceId 应用实例ID
|
||||
* @return true 停止成功,false 停止失败
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> stopInstance(Long instanceId) throws Exception {
|
||||
public ResultDTO<Void> stopInstance(Long instanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("instanceId", instanceId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.STOP_INSTANCE, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -217,15 +219,15 @@ public class OhMyClient {
|
||||
* 接口使用条件:调用接口时间与待取消任务的预计执行时间有一定时间间隔,否则不保证可靠性!
|
||||
* @param instanceId 任务实例ID
|
||||
* @return true 代表取消成功,false 取消失败
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> cancelInstance(Long instanceId) throws Exception {
|
||||
public ResultDTO<Void> cancelInstance(Long instanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("instanceId", instanceId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.CANCEL_INSTANCE, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -233,43 +235,43 @@ public class OhMyClient {
|
||||
* 只有完成状态(成功、失败、手动停止、被取消)的任务才能被重试,且暂不支持工作流内任务实例的重试
|
||||
* @param instanceId 任务实例ID
|
||||
* @return true 代表取消成功,false 取消失败
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> retryInstance(Long instanceId) throws Exception {
|
||||
public ResultDTO<Void> retryInstance(Long instanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("instanceId", instanceId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.RETRY_INSTANCE, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询任务实例状态
|
||||
* @param instanceId 应用实例ID
|
||||
* @return {@link InstanceStatus} 的枚举值
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Integer> fetchInstanceStatus(Long instanceId) throws Exception {
|
||||
public ResultDTO<Integer> fetchInstanceStatus(Long instanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("instanceId", instanceId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.FETCH_INSTANCE_STATUS, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, INTEGER_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询任务实例的信息
|
||||
* @param instanceId 任务实例ID
|
||||
* @return 任务实例信息
|
||||
* @throws Exception 潜在的异常
|
||||
* @throws PowerJobException 潜在的异常
|
||||
*/
|
||||
public ResultDTO<InstanceInfoDTO> fetchInstanceInfo(Long instanceId) throws Exception {
|
||||
public ResultDTO<InstanceInfoDTO> fetchInstanceInfo(Long instanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("instanceId", instanceId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.FETCH_INSTANCE_INFO, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, INSTANCE_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/* ************* Workflow 区 ************* */
|
||||
@ -277,74 +279,75 @@ public class OhMyClient {
|
||||
* 保存工作流(包括创建和修改)
|
||||
* @param request 创建/修改 Workflow 请求
|
||||
* @return 工作流ID
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Long> saveWorkflow(SaveWorkflowRequest request) throws Exception {
|
||||
public ResultDTO<Long> saveWorkflow(SaveWorkflowRequest request) throws PowerJobException {
|
||||
request.setAppId(appId);
|
||||
MediaType jsonType = MediaType.parse("application/json; charset=utf-8");
|
||||
String json = JSONObject.toJSONString(request);
|
||||
// 中坑记录:用 FastJSON 序列化会导致 Server 接收时 pEWorkflowDAG 为 null,无语.jpg
|
||||
String json = JsonUtils.toJSONStringUnsafe(request);
|
||||
String post = postHA(OpenAPIConstant.SAVE_WORKFLOW, RequestBody.create(jsonType, json));
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, LONG_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据 workflowId 查询工作流信息
|
||||
* @param workflowId workflowId
|
||||
* @return 工作流信息
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<WorkflowInfoDTO> fetchWorkflow(Long workflowId) throws Exception {
|
||||
public ResultDTO<WorkflowInfoDTO> fetchWorkflow(Long workflowId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("workflowId", workflowId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.FETCH_WORKFLOW, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, WF_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用某个工作流
|
||||
* @param workflowId 工作流ID
|
||||
* @return 标准返回对象
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> disableWorkflow(Long workflowId) throws Exception {
|
||||
public ResultDTO<Void> disableWorkflow(Long workflowId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("workflowId", workflowId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.DISABLE_WORKFLOW, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用某个工作流
|
||||
* @param workflowId workflowId
|
||||
* @return 标准返回对象
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> enableWorkflow(Long workflowId) throws Exception {
|
||||
public ResultDTO<Void> enableWorkflow(Long workflowId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("workflowId", workflowId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.ENABLE_WORKFLOW, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除某个工作流
|
||||
* @param workflowId workflowId
|
||||
* @return 标准返回对象
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> deleteWorkflow(Long workflowId) throws Exception {
|
||||
public ResultDTO<Void> deleteWorkflow(Long workflowId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("workflowId", workflowId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.DELETE_WORKFLOW, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -353,9 +356,9 @@ public class OhMyClient {
|
||||
* @param initParams 启动参数
|
||||
* @param delayMS 延迟时间,单位毫秒 ms
|
||||
* @return 工作流实例ID
|
||||
* @throws Exception 异常信息
|
||||
* @throws PowerJobException 异常信息
|
||||
*/
|
||||
public ResultDTO<Long> runWorkflow(Long workflowId, String initParams, long delayMS) throws Exception {
|
||||
public ResultDTO<Long> runWorkflow(Long workflowId, String initParams, long delayMS) throws PowerJobException {
|
||||
FormBody.Builder builder = new FormBody.Builder()
|
||||
.add("workflowId", workflowId.toString())
|
||||
.add("appId", appId.toString())
|
||||
@ -364,9 +367,9 @@ public class OhMyClient {
|
||||
builder.add("initParams", initParams);
|
||||
}
|
||||
String post = postHA(OpenAPIConstant.RUN_WORKFLOW, builder.build());
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, LONG_RESULT_TYPE);
|
||||
}
|
||||
public ResultDTO<Long> runWorkflow(Long workflowId) throws Exception {
|
||||
public ResultDTO<Long> runWorkflow(Long workflowId) throws PowerJobException {
|
||||
return runWorkflow(workflowId, null, 0);
|
||||
}
|
||||
|
||||
@ -375,30 +378,30 @@ public class OhMyClient {
|
||||
* 停止应用实例
|
||||
* @param wfInstanceId 工作流实例ID
|
||||
* @return true 停止成功 ; false 停止失败
|
||||
* @throws Exception 异常
|
||||
* @throws PowerJobException 异常
|
||||
*/
|
||||
public ResultDTO<Void> stopWorkflowInstance(Long wfInstanceId) throws Exception {
|
||||
public ResultDTO<Void> stopWorkflowInstance(Long wfInstanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("wfInstanceId", wfInstanceId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.STOP_WORKFLOW_INSTANCE, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, VOID_RESULT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询任务实例的信息
|
||||
* @param wfInstanceId 任务实例ID
|
||||
* @return 任务实例信息
|
||||
* @throws Exception 潜在的异常
|
||||
* @throws PowerJobException 潜在的异常
|
||||
*/
|
||||
public ResultDTO<WorkflowInstanceInfoDTO> fetchWorkflowInstanceInfo(Long wfInstanceId) throws Exception {
|
||||
public ResultDTO<WorkflowInstanceInfoDTO> fetchWorkflowInstanceInfo(Long wfInstanceId) throws PowerJobException {
|
||||
RequestBody body = new FormBody.Builder()
|
||||
.add("wfInstanceId", wfInstanceId.toString())
|
||||
.add("appId", appId.toString())
|
||||
.build();
|
||||
String post = postHA(OpenAPIConstant.FETCH_WORKFLOW_INSTANCE_INFO, body);
|
||||
return JSONObject.parseObject(post, ResultDTO.class);
|
||||
return JSONObject.parseObject(post, WF_INSTANCE_RESULT_TYPE);
|
||||
}
|
||||
|
||||
|
||||
@ -412,7 +415,7 @@ public class OhMyClient {
|
||||
if (StringUtils.isNotEmpty(res)) {
|
||||
return res;
|
||||
}
|
||||
}catch (Exception e) {
|
||||
}catch (IOException e) {
|
||||
log.warn("[OhMyClient] request url:{} failed, reason is {}.", url, e.toString());
|
||||
}
|
||||
|
||||
@ -429,7 +432,7 @@ public class OhMyClient {
|
||||
currentAddress = addr;
|
||||
return res;
|
||||
}
|
||||
}catch (Exception e) {
|
||||
}catch (IOException e) {
|
||||
log.warn("[OhMyClient] request url:{} failed, reason is {}.", url, e.toString());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,28 @@
|
||||
package com.github.kfcfans.powerjob.client;
|
||||
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.github.kfcfans.powerjob.common.response.*;
|
||||
|
||||
/**
|
||||
* 类型工厂
|
||||
*
|
||||
* @author tjq
|
||||
* @since 11/7/20
|
||||
*/
|
||||
public class TypeStore {
|
||||
|
||||
public static final TypeReference<ResultDTO<Void>> VOID_RESULT_TYPE = new TypeReference<ResultDTO<Void>>(){};
|
||||
|
||||
public static final TypeReference<ResultDTO<Integer>> INTEGER_RESULT_TYPE = new TypeReference<ResultDTO<Integer>>(){};
|
||||
|
||||
public static final TypeReference<ResultDTO<Long>> LONG_RESULT_TYPE = new TypeReference<ResultDTO<Long>>(){};
|
||||
|
||||
public static final TypeReference<ResultDTO<JobInfoDTO>> JOB_RESULT_TYPE = new TypeReference<ResultDTO<JobInfoDTO>>(){};
|
||||
|
||||
public static final TypeReference<ResultDTO<InstanceInfoDTO>> INSTANCE_RESULT_TYPE = new TypeReference<ResultDTO<InstanceInfoDTO>>() {};
|
||||
|
||||
public static final TypeReference<ResultDTO<WorkflowInfoDTO>> WF_RESULT_TYPE = new TypeReference<ResultDTO<WorkflowInfoDTO>>() {};
|
||||
|
||||
public static final TypeReference<ResultDTO<WorkflowInstanceInfoDTO>> WF_INSTANCE_RESULT_TYPE = new TypeReference<ResultDTO<WorkflowInstanceInfoDTO>>() {};
|
||||
|
||||
}
|
@ -21,6 +21,8 @@ public class TestClient {
|
||||
|
||||
private static OhMyClient ohMyClient;
|
||||
|
||||
public static final long JOB_ID = 4L;
|
||||
|
||||
@BeforeAll
|
||||
public static void initClient() throws Exception {
|
||||
ohMyClient = new OhMyClient("127.0.0.1:7700", "powerjob-agent-test", "123");
|
||||
@ -30,7 +32,7 @@ public class TestClient {
|
||||
public void testSaveJob() throws Exception {
|
||||
|
||||
SaveJobInfoRequest newJobInfo = new SaveJobInfoRequest();
|
||||
// newJobInfo.setId(8L);
|
||||
newJobInfo.setId(JOB_ID);
|
||||
newJobInfo.setJobName("omsOpenAPIJobccccc");
|
||||
newJobInfo.setJobDescription("tes OpenAPI");
|
||||
newJobInfo.setJobParams("{'aa':'bb'}");
|
||||
@ -38,8 +40,8 @@ public class TestClient {
|
||||
newJobInfo.setTimeExpression("0 0 * * * ? ");
|
||||
newJobInfo.setExecuteType(ExecuteType.STANDALONE);
|
||||
newJobInfo.setProcessorType(ProcessorType.EMBEDDED_JAVA);
|
||||
newJobInfo.setProcessorInfo("com.github.kfcfans.oms.server.tester.OmsLogPerformanceTester");
|
||||
newJobInfo.setDesignatedWorkers("192.168.1.1:2777");
|
||||
newJobInfo.setProcessorInfo("com.github.kfcfans.powerjob.samples.processors.StandaloneProcessorDemo");
|
||||
newJobInfo.setDesignatedWorkers("");
|
||||
|
||||
newJobInfo.setMinCpuCores(1.1);
|
||||
newJobInfo.setMinMemorySpace(1.2);
|
||||
@ -51,48 +53,53 @@ public class TestClient {
|
||||
|
||||
@Test
|
||||
public void testFetchJob() throws Exception {
|
||||
ResultDTO<JobInfoDTO> fetchJob = ohMyClient.fetchJob(1L);
|
||||
ResultDTO<JobInfoDTO> fetchJob = ohMyClient.fetchJob(JOB_ID);
|
||||
System.out.println(JSONObject.toJSONString(fetchJob));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisableJob() throws Exception {
|
||||
System.out.println(ohMyClient.disableJob(7L));
|
||||
System.out.println(ohMyClient.disableJob(JOB_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEnableJob() throws Exception {
|
||||
System.out.println(ohMyClient.enableJob(7L));
|
||||
System.out.println(ohMyClient.enableJob(JOB_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteJob() throws Exception {
|
||||
System.out.println(ohMyClient.deleteJob(7L));
|
||||
System.out.println(ohMyClient.deleteJob(JOB_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRunJob() throws Exception {
|
||||
System.out.println(ohMyClient.runJob(6L, "this is instanceParams", 60000));
|
||||
public void testRun() {
|
||||
System.out.println(ohMyClient.runJob(JOB_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRunJobDelay() throws Exception {
|
||||
System.out.println(ohMyClient.runJob(JOB_ID, "this is instanceParams", 60000));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFetchInstanceInfo() throws Exception {
|
||||
System.out.println(ohMyClient.fetchInstanceInfo(141251409466097728L));
|
||||
System.out.println(ohMyClient.fetchInstanceInfo(205436386851946560L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStopInstance() throws Exception {
|
||||
ResultDTO<Void> res = ohMyClient.stopInstance(141251409466097728L);
|
||||
ResultDTO<Void> res = ohMyClient.stopInstance(205436995885858880L);
|
||||
System.out.println(res.toString());
|
||||
}
|
||||
@Test
|
||||
public void testFetchInstanceStatus() throws Exception {
|
||||
System.out.println(ohMyClient.fetchInstanceStatus(141251409466097728L));
|
||||
System.out.println(ohMyClient.fetchInstanceStatus(205436995885858880L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCancelInstanceInTimeWheel() throws Exception {
|
||||
ResultDTO<Long> startRes = ohMyClient.runJob(15L, "start by OhMyClient", 20000);
|
||||
ResultDTO<Long> startRes = ohMyClient.runJob(JOB_ID, "start by OhMyClient", 20000);
|
||||
System.out.println("runJob result: " + JSONObject.toJSONString(startRes));
|
||||
ResultDTO<Void> cancelRes = ohMyClient.cancelInstance(startRes.getData());
|
||||
System.out.println("cancelJob result: " + JSONObject.toJSONString(cancelRes));
|
||||
|
@ -22,6 +22,8 @@ public class TestWorkflow {
|
||||
|
||||
private static OhMyClient ohMyClient;
|
||||
|
||||
private static final long WF_ID = 1;
|
||||
|
||||
@BeforeAll
|
||||
public static void initClient() throws Exception {
|
||||
ohMyClient = new OhMyClient("127.0.0.1:7700", "powerjob-agent-test", "123");
|
||||
@ -64,32 +66,33 @@ public class TestWorkflow {
|
||||
req.setEnable(true);
|
||||
req.setTimeExpressionType(TimeExpressionType.API);
|
||||
|
||||
System.out.println("req ->" + JSONObject.toJSON(req));
|
||||
System.out.println(ohMyClient.saveWorkflow(req));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisableWorkflow() throws Exception {
|
||||
System.out.println(ohMyClient.disableWorkflow(4L));
|
||||
System.out.println(ohMyClient.disableWorkflow(WF_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteWorkflow() throws Exception {
|
||||
System.out.println(ohMyClient.deleteWorkflow(4L));
|
||||
System.out.println(ohMyClient.deleteWorkflow(WF_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEnableWorkflow() throws Exception {
|
||||
System.out.println(ohMyClient.enableWorkflow(4L));
|
||||
System.out.println(ohMyClient.enableWorkflow(WF_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFetchWorkflowInfo() throws Exception {
|
||||
System.out.println(ohMyClient.fetchWorkflow(5L));
|
||||
System.out.println(ohMyClient.fetchWorkflow(WF_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRunWorkflow() throws Exception {
|
||||
System.out.println(ohMyClient.runWorkflow(5L));
|
||||
System.out.println(ohMyClient.runWorkflow(WF_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -104,6 +107,6 @@ public class TestWorkflow {
|
||||
|
||||
@Test
|
||||
public void testRunWorkflowPlus() throws Exception {
|
||||
System.out.println(ohMyClient.runWorkflow(1L, "this is init Params 2", 90000));
|
||||
System.out.println(ohMyClient.runWorkflow(WF_ID, "this is init Params 2", 90000));
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>powerjob-common</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
|
@ -33,5 +33,5 @@ public class RemoteConstant {
|
||||
|
||||
/* ************************ OTHERS ************************ */
|
||||
public static final String EMPTY_ADDRESS = "N/A";
|
||||
public static final long DEFAULT_TIMEOUT_MS = 3000;
|
||||
public static final long DEFAULT_TIMEOUT_MS = 5000;
|
||||
}
|
||||
|
@ -28,6 +28,8 @@ public class InstanceDetail implements OmsSerializable {
|
||||
private String result;
|
||||
// TaskTracker地址
|
||||
private String taskTrackerAddress;
|
||||
// 启动参数
|
||||
private String instanceParams;
|
||||
|
||||
// MR或BD任务专用
|
||||
private TaskDetail taskDetail;
|
||||
|
@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -20,7 +21,7 @@ import java.util.List;
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class PEWorkflowDAG {
|
||||
public class PEWorkflowDAG implements Serializable {
|
||||
|
||||
// DAG 图(点线表示法)
|
||||
private List<Node> nodes;
|
||||
@ -30,7 +31,7 @@ public class PEWorkflowDAG {
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Node {
|
||||
public static class Node implements Serializable {
|
||||
private Long jobId;
|
||||
private String jobName;
|
||||
|
||||
@ -50,7 +51,7 @@ public class PEWorkflowDAG {
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Edge {
|
||||
public static class Edge implements Serializable {
|
||||
private Long from;
|
||||
private Long to;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import com.github.kfcfans.powerjob.common.utils.CommonUtils;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -15,7 +16,7 @@ import java.util.List;
|
||||
* @since 2020/5/26
|
||||
*/
|
||||
@Data
|
||||
public class SaveWorkflowRequest {
|
||||
public class SaveWorkflowRequest implements Serializable {
|
||||
|
||||
private Long id;
|
||||
|
||||
|
@ -53,4 +53,8 @@ public class AskResponse implements OmsSerializable {
|
||||
return JsonUtils.parseObject(data, clz);
|
||||
}
|
||||
|
||||
public String parseDataAsString() {
|
||||
return new String(data, StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -21,6 +21,8 @@ public class WorkflowInstanceInfoDTO {
|
||||
|
||||
// workflow 状态(WorkflowInstanceStatus)
|
||||
private Integer status;
|
||||
// 工作流启动参数
|
||||
private String wfInitParams;
|
||||
|
||||
private String dag;
|
||||
private String result;
|
||||
|
@ -29,8 +29,12 @@ public class JsonUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String toJSONStringUnsafe(Object obj) throws JsonProcessingException {
|
||||
public static String toJSONStringUnsafe(Object obj) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(obj);
|
||||
}catch (Exception e) {
|
||||
throw new PowerJobException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] toBytes(Object obj) {
|
||||
|
@ -10,13 +10,13 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>powerjob-server</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<swagger.version>2.9.2</swagger.version>
|
||||
<springboot.version>2.3.4.RELEASE</springboot.version>
|
||||
<powerjob.common.version>3.3.1</powerjob.common.version>
|
||||
<powerjob.common.version>3.3.2</powerjob.common.version>
|
||||
<!-- 数据库驱动版本,使用的是spring-boot-dependencies管理的版本 -->
|
||||
<mysql.version>8.0.19</mysql.version>
|
||||
<ojdbc.version>19.7.0.0</ojdbc.version>
|
||||
|
@ -1,8 +1,11 @@
|
||||
package com.github.kfcfans.powerjob.server.akka;
|
||||
|
||||
import akka.actor.*;
|
||||
import akka.pattern.Patterns;
|
||||
import akka.routing.RoundRobinPool;
|
||||
import com.github.kfcfans.powerjob.common.PowerJobException;
|
||||
import com.github.kfcfans.powerjob.common.RemoteConstant;
|
||||
import com.github.kfcfans.powerjob.common.response.AskResponse;
|
||||
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;
|
||||
@ -16,8 +19,10 @@ import com.typesafe.config.ConfigFactory;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.CompletionStage;
|
||||
|
||||
/**
|
||||
* 服务端 ActorSystem 启动器
|
||||
@ -90,4 +95,19 @@ public class OhMyServer {
|
||||
String path = String.format(AKKA_PATH, RemoteConstant.WORKER_ACTOR_SYSTEM_NAME, address, RemoteConstant.WORKER_ACTOR_NAME);
|
||||
return actorSystem.actorSelection(path);
|
||||
}
|
||||
|
||||
/**
|
||||
* ASK 其他 powerjob-server,要求 AskResponse 中的 Data 为 String
|
||||
* @param address 其他 powerjob-server 的地址(ip:port)
|
||||
* @param request 请求
|
||||
* @return 返回值 OR 异常
|
||||
*/
|
||||
public static String askFriend(String address, Object request) throws Exception {
|
||||
CompletionStage<Object> askCS = Patterns.ask(getFriendActor(address), request, Duration.ofMillis(RemoteConstant.DEFAULT_TIMEOUT_MS));
|
||||
AskResponse askResponse = (AskResponse) askCS.toCompletableFuture().get();
|
||||
if (askResponse.isSuccess()) {
|
||||
return askResponse.parseDataAsString();
|
||||
}
|
||||
throw new PowerJobException("remote server process failed:" + askResponse.getMessage());
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,16 @@
|
||||
package com.github.kfcfans.powerjob.server.akka.actors;
|
||||
|
||||
import akka.actor.AbstractActor;
|
||||
import com.github.kfcfans.powerjob.common.PowerJobException;
|
||||
import com.github.kfcfans.powerjob.common.model.SystemMetrics;
|
||||
import com.github.kfcfans.powerjob.common.response.AskResponse;
|
||||
import com.github.kfcfans.powerjob.server.akka.requests.FriendQueryWorkerClusterStatusReq;
|
||||
import com.github.kfcfans.powerjob.server.akka.requests.Ping;
|
||||
import com.github.kfcfans.powerjob.server.akka.requests.RunJobOrWorkflowReq;
|
||||
import com.github.kfcfans.powerjob.server.common.utils.SpringUtils;
|
||||
import com.github.kfcfans.powerjob.server.service.JobService;
|
||||
import com.github.kfcfans.powerjob.server.service.ha.WorkerManagerService;
|
||||
import com.github.kfcfans.powerjob.server.service.workflow.WorkflowService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.Map;
|
||||
@ -22,6 +27,7 @@ public class FriendActor extends AbstractActor {
|
||||
public Receive createReceive() {
|
||||
return receiveBuilder()
|
||||
.match(Ping.class, this::onReceivePing)
|
||||
.match(RunJobOrWorkflowReq.class, this::onReceiveFriendResendRunRequest)
|
||||
.match(FriendQueryWorkerClusterStatusReq.class, this::onReceiveFriendQueryWorkerClusterStatusReq)
|
||||
.matchAny(obj -> log.warn("[FriendActor] receive unknown request: {}.", obj))
|
||||
.build();
|
||||
@ -42,4 +48,27 @@ public class FriendActor extends AbstractActor {
|
||||
AskResponse askResponse = AskResponse.succeed(workerInfo);
|
||||
getSender().tell(askResponse, getSelf());
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理 run 转发
|
||||
*/
|
||||
private void onReceiveFriendResendRunRequest(RunJobOrWorkflowReq req) {
|
||||
try {
|
||||
Long resultId;
|
||||
switch (req.getType()) {
|
||||
case RunJobOrWorkflowReq.WORKFLOW:
|
||||
resultId = SpringUtils.getBean(WorkflowService.class).runWorkflow(req.getId(), req.getAppId(), req.getParams(), req.getDelay());
|
||||
break;
|
||||
case RunJobOrWorkflowReq.JOB:
|
||||
resultId = SpringUtils.getBean(JobService.class).runJob(req.getId(), req.getParams(), req.getDelay());
|
||||
break;
|
||||
default:
|
||||
throw new PowerJobException("unknown type: " + req.getType());
|
||||
}
|
||||
getSender().tell(AskResponse.succeed(String.valueOf(resultId)), getSelf());
|
||||
} catch (Exception e) {
|
||||
log.error("[FriendActor] process run request [{}] failed!", req, e);
|
||||
getSender().tell(AskResponse.failed(e.getMessage()), getSelf());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,27 @@
|
||||
package com.github.kfcfans.powerjob.server.akka.requests;
|
||||
|
||||
import com.github.kfcfans.powerjob.common.OmsSerializable;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 运行 Job 或 工作流,需要转发到 server 进行,否则没有集群信息
|
||||
*
|
||||
* @author tjq
|
||||
* @since 11/7/20
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class RunJobOrWorkflowReq implements OmsSerializable {
|
||||
public static final int JOB = 1;
|
||||
public static final int WORKFLOW = 2;
|
||||
|
||||
private int type;
|
||||
private long id;
|
||||
private long delay;
|
||||
private String params;
|
||||
|
||||
private long appId;
|
||||
}
|
@ -5,11 +5,15 @@ import com.github.kfcfans.powerjob.common.PowerJobException;
|
||||
import com.github.kfcfans.powerjob.common.TimeExpressionType;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveJobInfoRequest;
|
||||
import com.github.kfcfans.powerjob.common.response.JobInfoDTO;
|
||||
import com.github.kfcfans.powerjob.server.akka.OhMyServer;
|
||||
import com.github.kfcfans.powerjob.server.akka.requests.RunJobOrWorkflowReq;
|
||||
import com.github.kfcfans.powerjob.server.common.SJ;
|
||||
import com.github.kfcfans.powerjob.server.common.constans.SwitchableStatus;
|
||||
import com.github.kfcfans.powerjob.server.common.utils.CronExpression;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.model.AppInfoDO;
|
||||
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.AppInfoRepository;
|
||||
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.instance.InstanceService;
|
||||
@ -22,6 +26,7 @@ import org.springframework.util.CollectionUtils;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
@ -44,6 +49,9 @@ public class JobService {
|
||||
@Resource
|
||||
private InstanceInfoRepository instanceInfoRepository;
|
||||
|
||||
@Resource
|
||||
private AppInfoRepository appInfoRepository;
|
||||
|
||||
/**
|
||||
* 保存/修改任务
|
||||
* @param request 任务请求
|
||||
@ -70,9 +78,8 @@ public class JobService {
|
||||
jobInfoDO.setTimeExpressionType(request.getTimeExpressionType().getV());
|
||||
jobInfoDO.setStatus(request.isEnable() ? SwitchableStatus.ENABLE.getV() : SwitchableStatus.DISABLE.getV());
|
||||
|
||||
if (jobInfoDO.getMaxWorkerCount() == null) {
|
||||
jobInfoDO.setMaxWorkerCount(0);
|
||||
}
|
||||
// 填充默认值,非空保护防止 NPE
|
||||
fillDefaultValue(jobInfoDO);
|
||||
|
||||
// 转化报警用户列表
|
||||
if (!CollectionUtils.isEmpty(request.getNotifyUserIds())) {
|
||||
@ -103,12 +110,30 @@ public class JobService {
|
||||
*/
|
||||
public long runJob(Long jobId, String instanceParams, long delay) {
|
||||
|
||||
log.info("[Job-{}] try to run job, instanceParams={},delay={} ms.", jobId, instanceParams, delay);
|
||||
|
||||
JobInfoDO jobInfo = jobInfoRepository.findById(jobId).orElseThrow(() -> new IllegalArgumentException("can't find job by id:" + jobId));
|
||||
|
||||
AppInfoDO appInfo = appInfoRepository.findById(jobInfo.getAppId()).orElseThrow(() -> new IllegalArgumentException("can't find appInfo by appId: " + jobInfo.getAppId()));
|
||||
String targetServer = appInfo.getCurrentServer();
|
||||
|
||||
if (Objects.equals(targetServer, OhMyServer.getActorSystemAddress())) {
|
||||
return realRunJob(jobInfo, instanceParams, delay);
|
||||
}
|
||||
|
||||
// 转发请求
|
||||
log.info("[Job-{}] redirect run request[params={}] to target server: {}", jobId, instanceParams, targetServer);
|
||||
RunJobOrWorkflowReq req = new RunJobOrWorkflowReq(RunJobOrWorkflowReq.JOB, jobId, delay, instanceParams, jobInfo.getAppId());
|
||||
try {
|
||||
return Long.parseLong(OhMyServer.askFriend(targetServer, req));
|
||||
}catch (Exception e) {
|
||||
log.error("[Job-{}] redirect run request[params={}] to target server[{}] failed!", jobId, instanceParams, targetServer);
|
||||
throw new PowerJobException("redirect run request failed!", e);
|
||||
}
|
||||
}
|
||||
|
||||
private long realRunJob(JobInfoDO jobInfo, String instanceParams, long delay) {
|
||||
log.info("[Job-{}] try to run job, instanceParams={},delay={} ms.", jobInfo.getId(), instanceParams, delay);
|
||||
Long instanceId = instanceService.create(jobInfo.getId(), jobInfo.getAppId(), instanceParams, null, System.currentTimeMillis() + Math.max(delay, 0));
|
||||
instanceInfoRepository.flush();
|
||||
|
||||
if (delay <= 0) {
|
||||
dispatchService.dispatch(jobInfo, instanceId, 0, instanceParams, null);
|
||||
}else {
|
||||
@ -116,7 +141,7 @@ public class JobService {
|
||||
dispatchService.dispatch(jobInfo, instanceId, 0, instanceParams, null);
|
||||
});
|
||||
}
|
||||
log.info("[Job-{}] run job successfully, instanceId={}", jobId, instanceId);
|
||||
log.info("[Job-{}] run job successfully, params={}, instanceId={}", jobInfo.getId(), instanceParams, instanceId);
|
||||
return instanceId;
|
||||
}
|
||||
|
||||
@ -204,4 +229,22 @@ public class JobService {
|
||||
jobInfoDO.setGmtModified(now);
|
||||
}
|
||||
|
||||
private void fillDefaultValue(JobInfoDO jobInfoDO) {
|
||||
if (jobInfoDO.getMaxWorkerCount() == null) {
|
||||
jobInfoDO.setMaxWorkerCount(0);
|
||||
}
|
||||
if (jobInfoDO.getMaxInstanceNum() == null) {
|
||||
jobInfoDO.setMaxInstanceNum(0);
|
||||
}
|
||||
if (jobInfoDO.getConcurrency() == null) {
|
||||
jobInfoDO.setConcurrency(5);
|
||||
}
|
||||
if (jobInfoDO.getInstanceRetryNum() == null) {
|
||||
jobInfoDO.setInstanceRetryNum(0);
|
||||
}
|
||||
if (jobInfoDO.getTaskRetryNum() == null) {
|
||||
jobInfoDO.setTaskRetryNum(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -248,6 +248,7 @@ public class InstanceService {
|
||||
if (askResponse.isSuccess()) {
|
||||
InstanceDetail instanceDetail = askResponse.getData(InstanceDetail.class);
|
||||
instanceDetail.setRunningTimes(instanceInfoDO.getRunningTimes());
|
||||
instanceDetail.setInstanceParams(instanceInfoDO.getInstanceParams());
|
||||
return instanceDetail;
|
||||
}else {
|
||||
log.warn("[Instance-{}] ask InstanceStatus from TaskTracker failed, the message is {}.", instanceId, askResponse.getMessage());
|
||||
|
@ -5,18 +5,24 @@ import com.github.kfcfans.powerjob.common.PowerJobException;
|
||||
import com.github.kfcfans.powerjob.common.TimeExpressionType;
|
||||
import com.github.kfcfans.powerjob.common.request.http.SaveWorkflowRequest;
|
||||
import com.github.kfcfans.powerjob.common.response.WorkflowInfoDTO;
|
||||
import com.github.kfcfans.powerjob.server.akka.OhMyServer;
|
||||
import com.github.kfcfans.powerjob.server.akka.requests.RunJobOrWorkflowReq;
|
||||
import com.github.kfcfans.powerjob.server.common.SJ;
|
||||
import com.github.kfcfans.powerjob.server.common.constans.SwitchableStatus;
|
||||
import com.github.kfcfans.powerjob.server.common.utils.CronExpression;
|
||||
import com.github.kfcfans.powerjob.server.common.utils.WorkflowDAGUtils;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.model.AppInfoDO;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.model.WorkflowInfoDO;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.repository.AppInfoRepository;
|
||||
import com.github.kfcfans.powerjob.server.persistence.core.repository.WorkflowInfoRepository;
|
||||
import com.github.kfcfans.powerjob.server.service.instance.InstanceTimeWheelService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Workflow 服务
|
||||
@ -24,9 +30,12 @@ import java.util.Date;
|
||||
* @author tjq
|
||||
* @since 2020/5/26
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WorkflowService {
|
||||
|
||||
@Resource
|
||||
private AppInfoRepository appInfoRepository;
|
||||
@Resource
|
||||
private WorkflowInstanceManager workflowInstanceManager;
|
||||
@Resource
|
||||
@ -138,8 +147,28 @@ public class WorkflowService {
|
||||
public Long runWorkflow(Long wfId, Long appId, String initParams, long delay) {
|
||||
|
||||
WorkflowInfoDO wfInfo = permissionCheck(wfId, appId);
|
||||
Long wfInstanceId = workflowInstanceManager.create(wfInfo, initParams);
|
||||
|
||||
AppInfoDO appInfo = appInfoRepository.findById(appId).orElseThrow(() -> new IllegalArgumentException("can't find appInfo by appId: " + appId));
|
||||
|
||||
String targetServer = appInfo.getCurrentServer();
|
||||
if (Objects.equals(targetServer, OhMyServer.getActorSystemAddress())) {
|
||||
return realRunWorkflow(wfInfo, initParams, delay);
|
||||
}
|
||||
|
||||
log.info("[WorkflowService-{}] redirect run request[initParams={}] to target server: {}", wfId, initParams, targetServer);
|
||||
// 转发请求
|
||||
RunJobOrWorkflowReq req = new RunJobOrWorkflowReq(RunJobOrWorkflowReq.WORKFLOW, wfId, delay, initParams, appId);
|
||||
try {
|
||||
return Long.valueOf(OhMyServer.askFriend(targetServer, req));
|
||||
}catch (Exception e) {
|
||||
log.error("[WorkflowService-{}] redirect run request[params={}] to target server[{}] failed!", wfId, initParams, targetServer);
|
||||
throw new PowerJobException("redirect run request failed!", e);
|
||||
}
|
||||
}
|
||||
|
||||
private Long realRunWorkflow(WorkflowInfoDO wfInfo, String initParams, long delay) {
|
||||
log.info("[WorkflowService-{}] try to run workflow, initParams={},delay={} ms.", wfInfo.getId(), initParams, delay);
|
||||
Long wfInstanceId = workflowInstanceManager.create(wfInfo, initParams);
|
||||
if (delay <= 0) {
|
||||
workflowInstanceManager.start(wfInfo, wfInstanceId, initParams);
|
||||
}else {
|
||||
|
@ -34,6 +34,8 @@ public class InstanceDetailVO {
|
||||
private String result;
|
||||
// TaskTracker地址
|
||||
private String taskTrackerAddress;
|
||||
// 启动参数
|
||||
private String instanceParams;
|
||||
|
||||
// MR或BD任务专用
|
||||
private InstanceDetailVO.TaskDetail taskDetail;
|
||||
|
@ -26,6 +26,8 @@ public class WorkflowInstanceInfoVO {
|
||||
|
||||
// workflow 状态(WorkflowInstanceStatus)
|
||||
private Integer status;
|
||||
// 工作流启动参数
|
||||
private String wfInitParams;
|
||||
|
||||
private PEWorkflowDAG pEWorkflowDAG;
|
||||
private String result;
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -12,15 +12,15 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"41f1f4da-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/views/ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true&":
|
||||
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f7b44cbc-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/views/ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true&":
|
||||
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||||
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"41f1f4da-vue-loader-template"}!./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!./src/components/views/ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true& ***!
|
||||
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f7b44cbc-vue-loader-template"}!./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!./src/components/views/ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true& ***!
|
||||
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
||||
/*! exports provided: render, staticRenderFns */
|
||||
/***/ (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 \"el-card\",\n { staticClass: \"box-card\" },\n [\n _c(\n \"el-form\",\n {\n ref: \"form\",\n staticClass: \"genTable\",\n attrs: {\n model: _vm.form,\n \"label-width\": \"150px\",\n \"label-position\": \"left\"\n }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: \"Group\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.group,\n callback: function($$v) {\n _vm.$set(_vm.form, \"group\", $$v)\n },\n expression: \"form.group\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Artifact\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.artifact,\n callback: function($$v) {\n _vm.$set(_vm.form, \"artifact\", $$v)\n },\n expression: \"form.artifact\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Name\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.name,\n callback: function($$v) {\n _vm.$set(_vm.form, \"name\", $$v)\n },\n expression: \"form.name\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Package name\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.packageName,\n callback: function($$v) {\n _vm.$set(_vm.form, \"packageName\", $$v)\n },\n expression: \"form.packageName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Java Version\" } },\n [\n _c(\n \"el-radio-group\",\n {\n model: {\n value: _vm.form.javaVersion,\n callback: function($$v) {\n _vm.$set(_vm.form, \"javaVersion\", $$v)\n },\n expression: \"form.javaVersion\"\n }\n },\n [\n _c(\"el-radio\", { attrs: { label: \"8\" } }),\n _c(\"el-radio\", { attrs: { label: \"11\" } })\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.onSubmit } },\n [_vm._v(\"Generate\")]\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/ContainerTemplate.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 \"el-card\",\n { staticClass: \"box-card\" },\n [\n _c(\n \"el-form\",\n {\n ref: \"form\",\n staticClass: \"genTable\",\n attrs: {\n model: _vm.form,\n \"label-width\": \"150px\",\n \"label-position\": \"left\"\n }\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: \"Group\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.group,\n callback: function($$v) {\n _vm.$set(_vm.form, \"group\", $$v)\n },\n expression: \"form.group\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Artifact\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.artifact,\n callback: function($$v) {\n _vm.$set(_vm.form, \"artifact\", $$v)\n },\n expression: \"form.artifact\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Name\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.name,\n callback: function($$v) {\n _vm.$set(_vm.form, \"name\", $$v)\n },\n expression: \"form.name\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Package name\" } },\n [\n _c(\"el-input\", {\n model: {\n value: _vm.form.packageName,\n callback: function($$v) {\n _vm.$set(_vm.form, \"packageName\", $$v)\n },\n expression: \"form.packageName\"\n }\n })\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"Java Version\" } },\n [\n _c(\n \"el-radio-group\",\n {\n model: {\n value: _vm.form.javaVersion,\n callback: function($$v) {\n _vm.$set(_vm.form, \"javaVersion\", $$v)\n },\n expression: \"form.javaVersion\"\n }\n },\n [\n _c(\"el-radio\", { attrs: { label: \"8\" } }),\n _c(\"el-radio\", { attrs: { label: \"11\" } })\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.onSubmit } },\n [_vm._v(\"Generate\")]\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/ContainerTemplate.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22f7b44cbc-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");
|
||||
|
||||
/***/ }),
|
||||
|
||||
@ -194,7 +194,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_41f1f4da_vue_loader_template_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_index_js_vue_loader_options_ContainerTemplate_vue_vue_type_template_id_a291308c_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"41f1f4da-vue-loader-template\"}!../../../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!./ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"41f1f4da-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/views/ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_41f1f4da_vue_loader_template_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_index_js_vue_loader_options_ContainerTemplate_vue_vue_type_template_id_a291308c_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_41f1f4da_vue_loader_template_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_index_js_vue_loader_options_ContainerTemplate_vue_vue_type_template_id_a291308c_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/components/views/ContainerTemplate.vue?");
|
||||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f7b44cbc_vue_loader_template_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_index_js_vue_loader_options_ContainerTemplate_vue_vue_type_template_id_a291308c_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f7b44cbc-vue-loader-template\"}!../../../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!./ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"f7b44cbc-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/views/ContainerTemplate.vue?vue&type=template&id=a291308c&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f7b44cbc_vue_loader_template_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_index_js_vue_loader_options_ContainerTemplate_vue_vue_type_template_id_a291308c_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f7b44cbc_vue_loader_template_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_index_js_vue_loader_options_ContainerTemplate_vue_vue_type_template_id_a291308c_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/components/views/ContainerTemplate.vue?");
|
||||
|
||||
/***/ })
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -10,12 +10,12 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>powerjob-worker-agent</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
|
||||
<properties>
|
||||
<powerjob.worker.version>3.3.1</powerjob.worker.version>
|
||||
<powerjob.worker.version>3.3.2</powerjob.worker.version>
|
||||
<logback.version>1.2.3</logback.version>
|
||||
<picocli.version>4.3.2</picocli.version>
|
||||
|
||||
|
@ -10,11 +10,11 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>powerjob-worker-samples</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
|
||||
<properties>
|
||||
<springboot.version>2.2.6.RELEASE</springboot.version>
|
||||
<powerjob.worker.starter.version>3.3.1</powerjob.worker.starter.version>
|
||||
<powerjob.worker.starter.version>3.3.2</powerjob.worker.starter.version>
|
||||
<fastjson.version>1.2.68</fastjson.version>
|
||||
|
||||
<!-- 部署时跳过该module -->
|
||||
|
@ -10,11 +10,11 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>powerjob-worker-spring-boot-starter</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<powerjob.worker.version>3.3.1</powerjob.worker.version>
|
||||
<powerjob.worker.version>3.3.2</powerjob.worker.version>
|
||||
<springboot.version>2.2.6.RELEASE</springboot.version>
|
||||
</properties>
|
||||
|
||||
|
@ -10,12 +10,12 @@
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>powerjob-worker</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<version>3.3.2</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<spring.version>5.2.4.RELEASE</spring.version>
|
||||
<powerjob.common.version>3.3.1</powerjob.common.version>
|
||||
<powerjob.common.version>3.3.2</powerjob.common.version>
|
||||
<h2.db.version>1.4.200</h2.db.version>
|
||||
<hikaricp.version>3.4.2</hikaricp.version>
|
||||
<junit.version>5.6.1</junit.version>
|
||||
|
@ -323,7 +323,7 @@ public class ProcessorTracker {
|
||||
|
||||
if (processor == null) {
|
||||
log.warn("[ProcessorTracker-{}] fetch Processor(type={},info={}) failed.", instanceId, processorType, processorInfo);
|
||||
throw new PowerJobException("fetch Processor failed");
|
||||
throw new PowerJobException("fetch Processor failed, please check your processorType and processorInfo config");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -236,8 +236,8 @@ public class CommonTaskTracker extends TaskTracker {
|
||||
try {
|
||||
AskResponse askResponse = (AskResponse) askCS.toCompletableFuture().get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
|
||||
serverAccepted = askResponse.isSuccess();
|
||||
}catch (Exception ignore) {
|
||||
log.warn("[TaskTracker-{}] report finished status failed, result={}.", instanceId, result);
|
||||
}catch (Exception e) {
|
||||
log.warn("[TaskTracker-{}] report finished status failed, result={}.", instanceId, result, e);
|
||||
}
|
||||
|
||||
// 服务器未接受上报,则等待下次重新上报
|
||||
|
Loading…
x
Reference in New Issue
Block a user