mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
feat: chang to use PowerJobRemoteEngine to replace akka
This commit is contained in:
parent
43df09bb38
commit
d46a6de26e
@ -36,7 +36,29 @@ public class RemoteConstant {
|
|||||||
|
|
||||||
/* ************************ SERVER ************************ */
|
/* ************************ SERVER ************************ */
|
||||||
public static final String SERVER_PATH = "server";
|
public static final String SERVER_PATH = "server";
|
||||||
|
/**
|
||||||
|
* server 处理在线日志
|
||||||
|
*/
|
||||||
public static final String SERVER_HANDLER_REPORT_LOG = "reportLog";
|
public static final String SERVER_HANDLER_REPORT_LOG = "reportLog";
|
||||||
|
/**
|
||||||
|
* server 处理 worker 心跳
|
||||||
|
*/
|
||||||
|
public static final String SERVER_HANDLER_WORKER_HEARTBEAT = "workerHeartbeat";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* server 处理 TaskTracker 上报的任务实例状态
|
||||||
|
*/
|
||||||
|
public static final String SERVER_HANDLER_REPORT_INSTANCE_STATUS = "reportInstanceStatus";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* server 查询任务的可执行集群
|
||||||
|
*/
|
||||||
|
public static final String SERVER_HANDLER_QUERY_JOB_CLUSTER = "queryJobCluster";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* server 处理 worker 请求部署容器命令
|
||||||
|
*/
|
||||||
|
public static final String SERVER_HANDLER_WORKER_NEED_DEPLOY_CONTAINER = "container";
|
||||||
|
|
||||||
/* ************************ Worker-TaskTracker ************************ */
|
/* ************************ Worker-TaskTracker ************************ */
|
||||||
public static final String WTT_PATH = "taskTracker";
|
public static final String WTT_PATH = "taskTracker";
|
||||||
|
@ -1,22 +1,13 @@
|
|||||||
package tech.powerjob.worker;
|
package tech.powerjob.worker;
|
||||||
|
|
||||||
import akka.actor.ActorRef;
|
|
||||||
import akka.actor.ActorSystem;
|
|
||||||
import akka.actor.DeadLetter;
|
|
||||||
import akka.actor.Props;
|
|
||||||
import akka.routing.RoundRobinPool;
|
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import com.typesafe.config.Config;
|
|
||||||
import com.typesafe.config.ConfigFactory;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeansException;
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.exception.PowerJobException;
|
import tech.powerjob.common.exception.PowerJobException;
|
||||||
import tech.powerjob.common.response.ResultDTO;
|
import tech.powerjob.common.response.ResultDTO;
|
||||||
import tech.powerjob.common.serialize.JsonUtils;
|
import tech.powerjob.common.serialize.JsonUtils;
|
||||||
|
@ -1,20 +1,17 @@
|
|||||||
package tech.powerjob.worker.actors;
|
package tech.powerjob.worker.actors;
|
||||||
|
|
||||||
import akka.actor.AbstractActor;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import akka.actor.Props;
|
import org.springframework.util.CollectionUtils;
|
||||||
import tech.powerjob.common.RemoteConstant;
|
import tech.powerjob.common.RemoteConstant;
|
||||||
import tech.powerjob.remote.framework.actor.Actor;
|
import tech.powerjob.remote.framework.actor.Actor;
|
||||||
import tech.powerjob.remote.framework.actor.Handler;
|
import tech.powerjob.remote.framework.actor.Handler;
|
||||||
import tech.powerjob.remote.framework.actor.ProcessType;
|
import tech.powerjob.remote.framework.actor.ProcessType;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.core.tracker.processor.ProcessorTracker;
|
|
||||||
import tech.powerjob.worker.core.tracker.manager.ProcessorTrackerManager;
|
import tech.powerjob.worker.core.tracker.manager.ProcessorTrackerManager;
|
||||||
|
import tech.powerjob.worker.core.tracker.processor.ProcessorTracker;
|
||||||
import tech.powerjob.worker.persistence.TaskDO;
|
import tech.powerjob.worker.persistence.TaskDO;
|
||||||
import tech.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
|
import tech.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
|
||||||
import tech.powerjob.worker.pojo.request.TaskTrackerStopInstanceReq;
|
import tech.powerjob.worker.pojo.request.TaskTrackerStopInstanceReq;
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.util.CollectionUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
package tech.powerjob.worker.actors;
|
package tech.powerjob.worker.actors;
|
||||||
|
|
||||||
import akka.actor.AbstractActor;
|
|
||||||
import akka.actor.Props;
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.enums.ExecuteType;
|
import tech.powerjob.common.enums.ExecuteType;
|
||||||
import tech.powerjob.common.enums.TimeExpressionType;
|
import tech.powerjob.common.enums.TimeExpressionType;
|
||||||
import tech.powerjob.common.model.InstanceDetail;
|
import tech.powerjob.common.model.InstanceDetail;
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
package tech.powerjob.worker.background;
|
package tech.powerjob.worker.background;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import tech.powerjob.common.enums.Protocol;
|
import tech.powerjob.common.enums.Protocol;
|
||||||
import tech.powerjob.common.model.SystemMetrics;
|
import tech.powerjob.common.model.SystemMetrics;
|
||||||
import tech.powerjob.common.request.WorkerHeartbeat;
|
import tech.powerjob.common.request.WorkerHeartbeat;
|
||||||
import tech.powerjob.worker.common.PowerJobWorkerVersion;
|
import tech.powerjob.worker.common.PowerJobWorkerVersion;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.common.utils.SystemInfoUtils;
|
import tech.powerjob.worker.common.utils.SystemInfoUtils;
|
||||||
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.container.OmsContainerFactory;
|
import tech.powerjob.worker.container.OmsContainerFactory;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
import tech.powerjob.worker.core.tracker.manager.HeavyTaskTrackerManager;
|
import tech.powerjob.worker.core.tracker.manager.HeavyTaskTrackerManager;
|
||||||
import tech.powerjob.worker.core.tracker.manager.LightTaskTrackerManager;
|
import tech.powerjob.worker.core.tracker.manager.LightTaskTrackerManager;
|
||||||
|
|
||||||
@ -68,8 +67,7 @@ public class WorkerHealthReporter implements Runnable {
|
|||||||
// 获取当前加载的容器列表
|
// 获取当前加载的容器列表
|
||||||
heartbeat.setContainerInfos(OmsContainerFactory.getDeployedContainerInfos());
|
heartbeat.setContainerInfos(OmsContainerFactory.getDeployedContainerInfos());
|
||||||
// 发送请求
|
// 发送请求
|
||||||
String serverPath = AkkaUtils.getServerActorPath(currentServer);
|
if (StringUtils.isEmpty(currentServer)) {
|
||||||
if (StringUtils.isEmpty(serverPath)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// log
|
// log
|
||||||
@ -82,7 +80,7 @@ public class WorkerHealthReporter implements Runnable {
|
|||||||
workerRuntime.getWorkerConfig().getMaxHeavyweightTaskNum(),
|
workerRuntime.getWorkerConfig().getMaxHeavyweightTaskNum(),
|
||||||
heartbeat.getHeavyTaskTrackerNum()
|
heartbeat.getHeavyTaskTrackerNum()
|
||||||
);
|
);
|
||||||
ActorSelection actorSelection = workerRuntime.getActorSystem().actorSelection(serverPath);
|
|
||||||
actorSelection.tell(heartbeat, null);
|
TransportUtils.reportWorkerHeartbeat(heartbeat, currentServer, workerRuntime.getTransporter());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
package tech.powerjob.worker.common.utils;
|
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.pattern.Patterns;
|
|
||||||
import tech.powerjob.common.exception.PowerJobException;
|
|
||||||
import tech.powerjob.common.response.AskResponse;
|
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.concurrent.CompletionStage;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AKKA 工具类
|
|
||||||
*
|
|
||||||
* @author tjq
|
|
||||||
* @since 2020/3/17
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
public class AkkaUtils {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* akka://<actor system>@<hostname>:<port>/<actor path>
|
|
||||||
*/
|
|
||||||
private static final String AKKA_NODE_PATH = "akka://%s@%s/user/%s";
|
|
||||||
|
|
||||||
public static String getAkkaWorkerPath(String address, String actorName) {
|
|
||||||
return String.format(AKKA_NODE_PATH, RemoteConstant.WORKER_ACTOR_SYSTEM_NAME, address, actorName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getServerActorPath(String serverAddress) {
|
|
||||||
if (StringUtils.isEmpty(serverAddress)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return String.format(AKKA_NODE_PATH, RemoteConstant.SERVER_ACTOR_SYSTEM_NAME, serverAddress, RemoteConstant.SERVER_ACTOR_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 可靠传输
|
|
||||||
* @param remote 远程 AKKA 节点
|
|
||||||
* @param msg 需要传输的对象
|
|
||||||
* @return true: 对方接收成功 / false: 对方接收失败(可能传输成功但对方处理失败,需要协同处理 AskResponse 返回值)
|
|
||||||
*/
|
|
||||||
public static boolean reliableTransmit(ActorSelection remote, Object msg) {
|
|
||||||
try {
|
|
||||||
return easyAsk(remote, msg).isSuccess();
|
|
||||||
}catch (Exception e) {
|
|
||||||
log.warn("[PowerTransmitter] transmit {} failed", msg, e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AskResponse easyAsk(ActorSelection remote, Object msg) {
|
|
||||||
try {
|
|
||||||
CompletionStage<Object> ask = Patterns.ask(remote, msg, Duration.ofMillis(RemoteConstant.DEFAULT_TIMEOUT_MS));
|
|
||||||
return (AskResponse) ask.toCompletableFuture().get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
|
|
||||||
}catch (Exception e) {
|
|
||||||
throw new PowerJobException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,9 +1,11 @@
|
|||||||
package tech.powerjob.worker.common.utils;
|
package tech.powerjob.worker.common.utils;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import tech.powerjob.common.PowerSerializable;
|
||||||
import tech.powerjob.common.RemoteConstant;
|
import tech.powerjob.common.RemoteConstant;
|
||||||
import tech.powerjob.common.exception.PowerJobCheckedException;
|
import tech.powerjob.common.exception.PowerJobCheckedException;
|
||||||
import tech.powerjob.common.request.WorkerLogReportReq;
|
import tech.powerjob.common.request.*;
|
||||||
import tech.powerjob.common.response.AskResponse;
|
import tech.powerjob.common.response.AskResponse;
|
||||||
import tech.powerjob.remote.framework.base.Address;
|
import tech.powerjob.remote.framework.base.Address;
|
||||||
import tech.powerjob.remote.framework.base.HandlerLocation;
|
import tech.powerjob.remote.framework.base.HandlerLocation;
|
||||||
@ -11,9 +13,7 @@ import tech.powerjob.remote.framework.base.ServerType;
|
|||||||
import tech.powerjob.remote.framework.base.URL;
|
import tech.powerjob.remote.framework.base.URL;
|
||||||
import tech.powerjob.remote.framework.transporter.Transporter;
|
import tech.powerjob.remote.framework.transporter.Transporter;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.pojo.request.ProcessorMapTaskRequest;
|
import tech.powerjob.worker.pojo.request.*;
|
||||||
import tech.powerjob.worker.pojo.request.ProcessorReportTaskStatusReq;
|
|
||||||
import tech.powerjob.worker.pojo.request.ProcessorTrackerStatusReportReq;
|
|
||||||
|
|
||||||
import java.util.concurrent.CompletionStage;
|
import java.util.concurrent.CompletionStage;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -29,6 +29,21 @@ import static tech.powerjob.common.RemoteConstant.*;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class TransportUtils {
|
public class TransportUtils {
|
||||||
|
|
||||||
|
public static void ttReportInstanceStatus(TaskTrackerReportInstanceStatusReq req, String address, Transporter transporter) {
|
||||||
|
final URL url = easyBuildUrl(ServerType.SERVER, SERVER_PATH, SERVER_HANDLER_REPORT_INSTANCE_STATUS, address);
|
||||||
|
transporter.tell(url, req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ttStartPtTask(TaskTrackerStartTaskReq req, String address, Transporter transporter) {
|
||||||
|
final URL url = easyBuildUrl(ServerType.WORKER, WPT_PATH, WPT_HANDLER_START_TASK, address);
|
||||||
|
transporter.tell(url, req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ttStopPtInstance(TaskTrackerStopInstanceReq req, String address, Transporter transporter) {
|
||||||
|
final URL url = easyBuildUrl(ServerType.WORKER, WPT_PATH, WPT_HANDLER_STOP_INSTANCE, address);
|
||||||
|
transporter.tell(url, req);
|
||||||
|
}
|
||||||
|
|
||||||
public static void ptReportTask(ProcessorReportTaskStatusReq req, String address, WorkerRuntime workerRuntime) {
|
public static void ptReportTask(ProcessorReportTaskStatusReq req, String address, WorkerRuntime workerRuntime) {
|
||||||
final URL url = easyBuildUrl(ServerType.WORKER, WTT_PATH, WTT_HANDLER_REPORT_TASK_STATUS, address);
|
final URL url = easyBuildUrl(ServerType.WORKER, WTT_PATH, WTT_HANDLER_REPORT_TASK_STATUS, address);
|
||||||
workerRuntime.getTransporter().tell(url, req);
|
workerRuntime.getTransporter().tell(url, req);
|
||||||
@ -44,15 +59,14 @@ public class TransportUtils {
|
|||||||
transporter.tell(url, req);
|
transporter.tell(url, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void reportWorkerHeartbeat(WorkerHeartbeat req, String address, Transporter transporter) {
|
||||||
|
final URL url = easyBuildUrl(ServerType.SERVER, SERVER_PATH, SERVER_HANDLER_WORKER_HEARTBEAT, address);
|
||||||
|
transporter.tell(url, req);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean reliablePtReportTask(ProcessorReportTaskStatusReq req, String address, WorkerRuntime workerRuntime) {
|
public static boolean reliablePtReportTask(ProcessorReportTaskStatusReq req, String address, WorkerRuntime workerRuntime) {
|
||||||
try {
|
try {
|
||||||
final URL url = easyBuildUrl(ServerType.WORKER, WTT_PATH, WTT_HANDLER_REPORT_TASK_STATUS, address);
|
return reliableAsk(ServerType.WORKER, WTT_PATH, WTT_HANDLER_REPORT_TASK_STATUS, address, req, workerRuntime.getTransporter()).isSuccess();
|
||||||
final CompletionStage<AskResponse> completionStage = workerRuntime.getTransporter().ask(url, req, AskResponse.class);
|
|
||||||
return completionStage
|
|
||||||
.toCompletableFuture()
|
|
||||||
.get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
|
|
||||||
.isSuccess();
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("[PowerJobTransport] reliablePtReportTask failed: {}", req, e);
|
log.warn("[PowerJobTransport] reliablePtReportTask failed: {}", req, e);
|
||||||
return false;
|
return false;
|
||||||
@ -61,18 +75,35 @@ public class TransportUtils {
|
|||||||
|
|
||||||
public static boolean reliableMapTask(ProcessorMapTaskRequest req, String address, WorkerRuntime workerRuntime) throws PowerJobCheckedException {
|
public static boolean reliableMapTask(ProcessorMapTaskRequest req, String address, WorkerRuntime workerRuntime) throws PowerJobCheckedException {
|
||||||
try {
|
try {
|
||||||
final URL url = easyBuildUrl(ServerType.WORKER, WTT_PATH, WTT_HANDLER_MAP_TASK, address);
|
return reliableAsk(ServerType.WORKER, WTT_PATH, WTT_HANDLER_MAP_TASK, address, req, workerRuntime.getTransporter()).isSuccess();
|
||||||
final CompletionStage<AskResponse> completionStage = workerRuntime.getTransporter().ask(url, req, AskResponse.class);
|
|
||||||
return completionStage
|
|
||||||
.toCompletableFuture()
|
|
||||||
.get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
|
|
||||||
.isSuccess();
|
|
||||||
|
|
||||||
} catch (Throwable throwable) {
|
} catch (Throwable throwable) {
|
||||||
throw new PowerJobCheckedException(throwable);
|
throw new PowerJobCheckedException(throwable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public static boolean reliableTtReportInstanceStatus(TaskTrackerReportInstanceStatusReq req, String address, Transporter transporter) {
|
||||||
|
return reliableAsk(ServerType.SERVER, SERVER_PATH, SERVER_HANDLER_REPORT_INSTANCE_STATUS, address, req, transporter).isSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public static AskResponse reliableQueryJobCluster(WorkerQueryExecutorClusterReq req, String address, Transporter transporter) {
|
||||||
|
return reliableAsk(ServerType.SERVER, SERVER_PATH, SERVER_HANDLER_QUERY_JOB_CLUSTER, address, req, transporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public static AskResponse reliableQueryContainerInfo(WorkerNeedDeployContainerRequest req, String address, Transporter transporter) {
|
||||||
|
return reliableAsk(ServerType.SERVER, SERVER_PATH, SERVER_HANDLER_WORKER_NEED_DEPLOY_CONTAINER, address, req, transporter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static AskResponse reliableAsk(ServerType t, String rootPath, String handlerPath, String address, PowerSerializable req, Transporter transporter) throws Exception {
|
||||||
|
final URL url = easyBuildUrl(ServerType.WORKER, WTT_PATH, WTT_HANDLER_MAP_TASK, address);
|
||||||
|
final CompletionStage<AskResponse> completionStage = transporter.ask(url, req, AskResponse.class);
|
||||||
|
return completionStage
|
||||||
|
.toCompletableFuture()
|
||||||
|
.get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
public static URL easyBuildUrl(ServerType serverType, String rootPath, String handlerPath, String address) {
|
public static URL easyBuildUrl(ServerType serverType, String rootPath, String handlerPath, String address) {
|
||||||
HandlerLocation handlerLocation = new HandlerLocation()
|
HandlerLocation handlerLocation = new HandlerLocation()
|
||||||
.setServerType(serverType)
|
.setServerType(serverType)
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
package tech.powerjob.worker.container;
|
package tech.powerjob.worker.container;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.pattern.Patterns;
|
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.model.DeployedContainerInfo;
|
import tech.powerjob.common.model.DeployedContainerInfo;
|
||||||
import tech.powerjob.common.request.ServerDeployContainerRequest;
|
import tech.powerjob.common.request.ServerDeployContainerRequest;
|
||||||
import tech.powerjob.common.request.WorkerNeedDeployContainerRequest;
|
import tech.powerjob.common.request.WorkerNeedDeployContainerRequest;
|
||||||
@ -12,14 +9,13 @@ import com.google.common.collect.Lists;
|
|||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.CompletionStage;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 容器工厂
|
* 容器工厂
|
||||||
@ -39,16 +35,14 @@ public class OmsContainerFactory {
|
|||||||
* @param serverActor 当容器不存在且 serverActor 非空时,尝试从服务端重新拉取容器
|
* @param serverActor 当容器不存在且 serverActor 非空时,尝试从服务端重新拉取容器
|
||||||
* @return 容器示例,可能为 null
|
* @return 容器示例,可能为 null
|
||||||
*/
|
*/
|
||||||
public static OmsContainer fetchContainer(Long containerId, ActorSelection serverActor) {
|
public static OmsContainer fetchContainer(Long containerId, WorkerRuntime workerRuntime) {
|
||||||
|
|
||||||
OmsContainer omsContainer = CARGO.get(containerId);
|
OmsContainer omsContainer = CARGO.get(containerId);
|
||||||
if (omsContainer != null) {
|
if (omsContainer != null) {
|
||||||
return omsContainer;
|
return omsContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serverActor == null) {
|
final String currentServerAddress = workerRuntime.getServerDiscoveryService().getCurrentServerAddress();
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 尝试从 server 加载
|
// 尝试从 server 加载
|
||||||
log.info("[OmsContainer-{}] can't find the container in factory, try to deploy from server.", containerId);
|
log.info("[OmsContainer-{}] can't find the container in factory, try to deploy from server.", containerId);
|
||||||
@ -56,8 +50,7 @@ public class OmsContainerFactory {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
CompletionStage<Object> askCS = Patterns.ask(serverActor, request, Duration.ofMillis(RemoteConstant.DEFAULT_TIMEOUT_MS));
|
AskResponse askResponse = TransportUtils.reliableQueryContainerInfo(request, currentServerAddress, workerRuntime.getTransporter());
|
||||||
AskResponse askResponse = (AskResponse) askCS.toCompletableFuture().get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
|
|
||||||
|
|
||||||
if (askResponse.isSuccess()) {
|
if (askResponse.isSuccess()) {
|
||||||
ServerDeployContainerRequest deployRequest = askResponse.getData(ServerDeployContainerRequest.class);
|
ServerDeployContainerRequest deployRequest = askResponse.getData(ServerDeployContainerRequest.class);
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package tech.powerjob.worker.core.processor;
|
package tech.powerjob.worker.core.processor;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
import tech.powerjob.common.enums.ProcessorType;
|
import tech.powerjob.common.enums.ProcessorType;
|
||||||
import tech.powerjob.common.exception.PowerJobException;
|
import tech.powerjob.common.exception.PowerJobException;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.common.utils.SpringUtils;
|
import tech.powerjob.worker.common.utils.SpringUtils;
|
||||||
import tech.powerjob.worker.container.OmsContainer;
|
import tech.powerjob.worker.container.OmsContainer;
|
||||||
import tech.powerjob.worker.container.OmsContainerFactory;
|
import tech.powerjob.worker.container.OmsContainerFactory;
|
||||||
@ -62,9 +60,7 @@ public class ProcessorLoader {
|
|||||||
String[] split = processorInfo.split("#");
|
String[] split = processorInfo.split("#");
|
||||||
log.info("[ProcessorLoader] try to load processor({}) in container({})", split[1], split[0]);
|
log.info("[ProcessorLoader] try to load processor({}) in container({})", split[1], split[0]);
|
||||||
|
|
||||||
String serverPath = AkkaUtils.getServerActorPath(workerRuntime.getServerDiscoveryService().getCurrentServerAddress());
|
OmsContainer omsContainer = OmsContainerFactory.fetchContainer(Long.valueOf(split[0]), workerRuntime);
|
||||||
ActorSelection actorSelection = workerRuntime.getActorSystem().actorSelection(serverPath);
|
|
||||||
OmsContainer omsContainer = OmsContainerFactory.fetchContainer(Long.valueOf(split[0]), actorSelection);
|
|
||||||
if (omsContainer != null) {
|
if (omsContainer != null) {
|
||||||
processorInfoHolder = ProcessorInfo.of(omsContainer.getProcessor(split[1]), omsContainer.getContainerClassLoader());
|
processorInfoHolder = ProcessorInfo.of(omsContainer.getProcessor(split[1]), omsContainer.getContainerClassLoader());
|
||||||
} else {
|
} else {
|
||||||
|
@ -5,7 +5,6 @@ import tech.powerjob.worker.common.WorkerRuntime;
|
|||||||
import tech.powerjob.worker.common.ThreadLocalStore;
|
import tech.powerjob.worker.common.ThreadLocalStore;
|
||||||
import tech.powerjob.worker.common.constants.TaskConstant;
|
import tech.powerjob.worker.common.constants.TaskConstant;
|
||||||
import tech.powerjob.worker.common.constants.TaskStatus;
|
import tech.powerjob.worker.common.constants.TaskStatus;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.common.serialize.SerializerUtils;
|
import tech.powerjob.common.serialize.SerializerUtils;
|
||||||
import tech.powerjob.worker.common.utils.TransportUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.common.utils.WorkflowContextUtils;
|
import tech.powerjob.worker.common.utils.WorkflowContextUtils;
|
||||||
|
@ -3,12 +3,10 @@ package tech.powerjob.worker.core.processor.sdk;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.exception.PowerJobCheckedException;
|
import tech.powerjob.common.exception.PowerJobCheckedException;
|
||||||
import tech.powerjob.worker.common.ThreadLocalStore;
|
import tech.powerjob.worker.common.ThreadLocalStore;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.constants.TaskConstant;
|
import tech.powerjob.worker.common.constants.TaskConstant;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.common.utils.TransportUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.persistence.TaskDO;
|
import tech.powerjob.worker.persistence.TaskDO;
|
||||||
import tech.powerjob.worker.pojo.request.ProcessorMapTaskRequest;
|
import tech.powerjob.worker.pojo.request.ProcessorMapTaskRequest;
|
||||||
|
@ -9,12 +9,9 @@ import tech.powerjob.common.RemoteConstant;
|
|||||||
import tech.powerjob.common.enums.ExecuteType;
|
import tech.powerjob.common.enums.ExecuteType;
|
||||||
import tech.powerjob.common.enums.ProcessorType;
|
import tech.powerjob.common.enums.ProcessorType;
|
||||||
import tech.powerjob.common.enums.TimeExpressionType;
|
import tech.powerjob.common.enums.TimeExpressionType;
|
||||||
import tech.powerjob.common.model.LogConfig;
|
|
||||||
import tech.powerjob.common.serialize.JsonUtils;
|
|
||||||
import tech.powerjob.common.utils.CommonUtils;
|
import tech.powerjob.common.utils.CommonUtils;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.constants.TaskStatus;
|
import tech.powerjob.worker.common.constants.TaskStatus;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.common.utils.TransportUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.core.processor.ProcessorInfo;
|
import tech.powerjob.worker.core.processor.ProcessorInfo;
|
||||||
import tech.powerjob.worker.core.processor.runnable.HeavyProcessorRunnable;
|
import tech.powerjob.worker.core.processor.runnable.HeavyProcessorRunnable;
|
||||||
@ -22,7 +19,6 @@ import tech.powerjob.worker.core.processor.ProcessorLoader;
|
|||||||
import tech.powerjob.worker.core.tracker.manager.ProcessorTrackerManager;
|
import tech.powerjob.worker.core.tracker.manager.ProcessorTrackerManager;
|
||||||
import tech.powerjob.worker.log.OmsLogger;
|
import tech.powerjob.worker.log.OmsLogger;
|
||||||
import tech.powerjob.worker.log.OmsLoggerFactory;
|
import tech.powerjob.worker.log.OmsLoggerFactory;
|
||||||
import tech.powerjob.worker.log.impl.OmsServerLogger;
|
|
||||||
import tech.powerjob.worker.persistence.TaskDO;
|
import tech.powerjob.worker.persistence.TaskDO;
|
||||||
import tech.powerjob.worker.pojo.model.InstanceInfo;
|
import tech.powerjob.worker.pojo.model.InstanceInfo;
|
||||||
import tech.powerjob.worker.pojo.request.ProcessorReportTaskStatusReq;
|
import tech.powerjob.worker.pojo.request.ProcessorReportTaskStatusReq;
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package tech.powerjob.worker.core.tracker.task;
|
package tech.powerjob.worker.core.tracker.task;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.pattern.Patterns;
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
@ -9,16 +7,12 @@ import tech.powerjob.common.enums.InstanceStatus;
|
|||||||
import tech.powerjob.common.model.InstanceDetail;
|
import tech.powerjob.common.model.InstanceDetail;
|
||||||
import tech.powerjob.common.request.ServerScheduleJobReq;
|
import tech.powerjob.common.request.ServerScheduleJobReq;
|
||||||
import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
|
import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
|
||||||
import tech.powerjob.common.response.AskResponse;
|
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.pojo.model.InstanceInfo;
|
import tech.powerjob.worker.pojo.model.InstanceInfo;
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.CompletionStage;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -107,18 +101,15 @@ public abstract class TaskTracker {
|
|||||||
response.setStartTime(System.currentTimeMillis());
|
response.setStartTime(System.currentTimeMillis());
|
||||||
response.setSourceAddress(workerRuntime.getWorkerAddress());
|
response.setSourceAddress(workerRuntime.getWorkerAddress());
|
||||||
|
|
||||||
String serverPath = AkkaUtils.getServerActorPath(workerRuntime.getServerDiscoveryService().getCurrentServerAddress());
|
TransportUtils.ttReportInstanceStatus(response, workerRuntime.getServerDiscoveryService().getCurrentServerAddress(), workerRuntime.getTransporter());
|
||||||
ActorSelection serverActor = workerRuntime.getActorSystem().actorSelection(serverPath);
|
|
||||||
serverActor.tell(response, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void reportFinalStatusThenDestroy(ActorSelection serverActor, TaskTrackerReportInstanceStatusReq reportInstanceStatusReq) {
|
protected void reportFinalStatusThenDestroy(WorkerRuntime workerRuntime, TaskTrackerReportInstanceStatusReq reportInstanceStatusReq) {
|
||||||
|
String currentServerAddress = workerRuntime.getServerDiscoveryService().getCurrentServerAddress();
|
||||||
// 最终状态需要可靠上报
|
// 最终状态需要可靠上报
|
||||||
CompletionStage<Object> ask = Patterns.ask(serverActor, reportInstanceStatusReq, Duration.ofSeconds(15));
|
|
||||||
boolean serverAccepted = false;
|
boolean serverAccepted = false;
|
||||||
try {
|
try {
|
||||||
AskResponse askResponse = (AskResponse) ask.toCompletableFuture().get(15, TimeUnit.SECONDS);
|
serverAccepted = TransportUtils.reliableTtReportInstanceStatus(reportInstanceStatusReq, currentServerAddress, workerRuntime.getTransporter());
|
||||||
serverAccepted = askResponse.isSuccess();
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warn("[TaskTracker-{}] report finished status failed, req={}.", instanceId, reportInstanceStatusReq, e);
|
log.warn("[TaskTracker-{}] report finished status failed, req={}.", instanceId, reportInstanceStatusReq, e);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package tech.powerjob.worker.core.tracker.task.heavy;
|
package tech.powerjob.worker.core.tracker.task.heavy;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.pattern.Patterns;
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
@ -20,7 +18,7 @@ import tech.powerjob.common.response.AskResponse;
|
|||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.constants.TaskConstant;
|
import tech.powerjob.worker.common.constants.TaskConstant;
|
||||||
import tech.powerjob.worker.common.constants.TaskStatus;
|
import tech.powerjob.worker.common.constants.TaskStatus;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.persistence.TaskDO;
|
import tech.powerjob.worker.persistence.TaskDO;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
@ -229,22 +227,19 @@ public class CommonTaskTracker extends HeavyTaskTracker {
|
|||||||
result = SystemInstanceResult.INSTANCE_EXECUTE_TIMEOUT;
|
result = SystemInstanceResult.INSTANCE_EXECUTE_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
String serverPath = AkkaUtils.getServerActorPath(workerRuntime.getServerDiscoveryService().getCurrentServerAddress());
|
|
||||||
ActorSelection serverActor = workerRuntime.getActorSystem().actorSelection(serverPath);
|
|
||||||
|
|
||||||
// 4. 执行完毕,报告服务器
|
// 4. 执行完毕,报告服务器
|
||||||
if (finished.get()) {
|
if (finished.get()) {
|
||||||
req.setResult(result);
|
req.setResult(result);
|
||||||
// 上报追加的工作流上下文信息
|
// 上报追加的工作流上下文信息
|
||||||
req.setAppendedWfContext(appendedWfContext);
|
req.setAppendedWfContext(appendedWfContext);
|
||||||
req.setInstanceStatus(success ? InstanceStatus.SUCCEED.getV() : InstanceStatus.FAILED.getV());
|
req.setInstanceStatus(success ? InstanceStatus.SUCCEED.getV() : InstanceStatus.FAILED.getV());
|
||||||
reportFinalStatusThenDestroy(serverActor,req);
|
reportFinalStatusThenDestroy(workerRuntime, req);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. 未完成,上报状态
|
// 5. 未完成,上报状态
|
||||||
req.setInstanceStatus(InstanceStatus.RUNNING.getV());
|
req.setInstanceStatus(InstanceStatus.RUNNING.getV());
|
||||||
serverActor.tell(req, null);
|
TransportUtils.ttReportInstanceStatus(req, workerRuntime.getServerDiscoveryService().getCurrentServerAddress(), workerRuntime.getTransporter());
|
||||||
|
|
||||||
// 6.1 定期检查 -> 重试派发后未确认的任务
|
// 6.1 定期检查 -> 重试派发后未确认的任务
|
||||||
long currentMS = System.currentTimeMillis();
|
long currentMS = System.currentTimeMillis();
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package tech.powerjob.worker.core.tracker.task.heavy;
|
package tech.powerjob.worker.core.tracker.task.heavy;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
@ -22,8 +21,8 @@ import tech.powerjob.common.serialize.JsonUtils;
|
|||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.constants.TaskConstant;
|
import tech.powerjob.worker.common.constants.TaskConstant;
|
||||||
import tech.powerjob.worker.common.constants.TaskStatus;
|
import tech.powerjob.worker.common.constants.TaskStatus;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.common.utils.LRUCache;
|
import tech.powerjob.worker.common.utils.LRUCache;
|
||||||
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.persistence.TaskDO;
|
import tech.powerjob.worker.persistence.TaskDO;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -358,13 +357,8 @@ public class FrequentTaskTracker extends HeavyTaskTracker {
|
|||||||
log.warn("[FQTaskTracker-{}] report alert req,time:{}", instanceId, req.getReportTime());
|
log.warn("[FQTaskTracker-{}] report alert req,time:{}", instanceId, req.getReportTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
String serverPath = AkkaUtils.getServerActorPath(currentServerAddress);
|
|
||||||
if (StringUtils.isEmpty(serverPath)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 非可靠通知,Server挂掉后任务的kill工作交由其他线程去做
|
// 非可靠通知,Server挂掉后任务的kill工作交由其他线程去做
|
||||||
ActorSelection serverActor = workerRuntime.getActorSystem().actorSelection(serverPath);
|
TransportUtils.ttReportInstanceStatus(req, currentServerAddress, workerRuntime.getTransporter());
|
||||||
serverActor.tell(req, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
package tech.powerjob.worker.core.tracker.task.heavy;
|
package tech.powerjob.worker.core.tracker.task.heavy;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
import tech.powerjob.common.enums.ExecuteType;
|
import tech.powerjob.common.enums.ExecuteType;
|
||||||
import tech.powerjob.common.enums.InstanceStatus;
|
|
||||||
import tech.powerjob.common.RemoteConstant;
|
import tech.powerjob.common.RemoteConstant;
|
||||||
import tech.powerjob.common.enums.TimeExpressionType;
|
import tech.powerjob.common.enums.TimeExpressionType;
|
||||||
import tech.powerjob.common.model.InstanceDetail;
|
|
||||||
import tech.powerjob.common.request.ServerScheduleJobReq;
|
import tech.powerjob.common.request.ServerScheduleJobReq;
|
||||||
import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
|
|
||||||
import tech.powerjob.common.request.WorkerQueryExecutorClusterReq;
|
import tech.powerjob.common.request.WorkerQueryExecutorClusterReq;
|
||||||
import tech.powerjob.common.response.AskResponse;
|
import tech.powerjob.common.response.AskResponse;
|
||||||
import tech.powerjob.common.utils.CommonUtils;
|
import tech.powerjob.common.utils.CommonUtils;
|
||||||
@ -18,7 +16,7 @@ import tech.powerjob.common.utils.SegmentLock;
|
|||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.constants.TaskConstant;
|
import tech.powerjob.worker.common.constants.TaskConstant;
|
||||||
import tech.powerjob.worker.common.constants.TaskStatus;
|
import tech.powerjob.worker.common.constants.TaskStatus;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.common.utils.WorkflowContextUtils;
|
import tech.powerjob.worker.common.utils.WorkflowContextUtils;
|
||||||
import tech.powerjob.worker.core.ha.ProcessorTrackerStatusHolder;
|
import tech.powerjob.worker.core.ha.ProcessorTrackerStatusHolder;
|
||||||
import tech.powerjob.worker.core.tracker.manager.HeavyTaskTrackerManager;
|
import tech.powerjob.worker.core.tracker.manager.HeavyTaskTrackerManager;
|
||||||
@ -32,15 +30,10 @@ import com.google.common.base.Stopwatch;
|
|||||||
import com.google.common.cache.Cache;
|
import com.google.common.cache.Cache;
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
|
||||||
import org.springframework.util.CollectionUtils;
|
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -365,11 +358,9 @@ public abstract class HeavyTaskTracker extends TaskTracker {
|
|||||||
// 1. 通知 ProcessorTracker 释放资源
|
// 1. 通知 ProcessorTracker 释放资源
|
||||||
TaskTrackerStopInstanceReq stopRequest = new TaskTrackerStopInstanceReq();
|
TaskTrackerStopInstanceReq stopRequest = new TaskTrackerStopInstanceReq();
|
||||||
stopRequest.setInstanceId(instanceId);
|
stopRequest.setInstanceId(instanceId);
|
||||||
ptStatusHolder.getAllProcessorTrackers().forEach(ptIP -> {
|
ptStatusHolder.getAllProcessorTrackers().forEach(ptAddress -> {
|
||||||
String ptPath = AkkaUtils.getAkkaWorkerPath(ptIP, RemoteConstant.PROCESSOR_TRACKER_ACTOR_NAME);
|
|
||||||
ActorSelection ptActor = workerRuntime.getActorSystem().actorSelection(ptPath);
|
|
||||||
// 不可靠通知,ProcessorTracker 也可以靠自己的定时任务/问询等方式关闭
|
// 不可靠通知,ProcessorTracker 也可以靠自己的定时任务/问询等方式关闭
|
||||||
ptActor.tell(stopRequest, null);
|
TransportUtils.ttStopPtInstance(stopRequest, ptAddress, workerRuntime.getTransporter());
|
||||||
});
|
});
|
||||||
|
|
||||||
// 2. 删除所有数据库数据
|
// 2. 删除所有数据库数据
|
||||||
@ -425,9 +416,7 @@ public abstract class HeavyTaskTracker extends TaskTracker {
|
|||||||
|
|
||||||
// 4. 任务派发
|
// 4. 任务派发
|
||||||
TaskTrackerStartTaskReq startTaskReq = new TaskTrackerStartTaskReq(instanceInfo, task, workerRuntime.getWorkerAddress());
|
TaskTrackerStartTaskReq startTaskReq = new TaskTrackerStartTaskReq(instanceInfo, task, workerRuntime.getWorkerAddress());
|
||||||
String ptActorPath = AkkaUtils.getAkkaWorkerPath(processorTrackerAddress, RemoteConstant.PROCESSOR_TRACKER_ACTOR_NAME);
|
TransportUtils.ttStartPtTask(startTaskReq, processorTrackerAddress, workerRuntime.getTransporter());
|
||||||
ActorSelection ptActor = workerRuntime.getActorSystem().actorSelection(ptActorPath);
|
|
||||||
ptActor.tell(startTaskReq, null);
|
|
||||||
|
|
||||||
log.debug("[TaskTracker-{}] dispatch task(taskId={},taskName={}) successfully.", instanceId, task.getTaskId(), task.getTaskName());
|
log.debug("[TaskTracker-{}] dispatch task(taskId={},taskName={}) successfully.", instanceId, task.getTaskId(), task.getTaskName());
|
||||||
}
|
}
|
||||||
@ -524,18 +513,20 @@ public abstract class HeavyTaskTracker extends TaskTracker {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String serverPath = AkkaUtils.getServerActorPath(workerRuntime.getServerDiscoveryService().getCurrentServerAddress());
|
final String currentServerAddress = workerRuntime.getServerDiscoveryService().getCurrentServerAddress();
|
||||||
if (StringUtils.isEmpty(serverPath)) {
|
if (StringUtils.isEmpty(currentServerAddress)) {
|
||||||
log.warn("[TaskTracker-{}] no server available, won't start worker detective!", instanceId);
|
log.warn("[TaskTracker-{}] no server available, won't start worker detective!", instanceId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
WorkerQueryExecutorClusterReq req = new WorkerQueryExecutorClusterReq(workerRuntime.getAppId(), instanceInfo.getJobId());
|
WorkerQueryExecutorClusterReq req = new WorkerQueryExecutorClusterReq(workerRuntime.getAppId(), instanceInfo.getJobId());
|
||||||
AskResponse response = AkkaUtils.easyAsk(workerRuntime.getActorSystem().actorSelection(serverPath), req);
|
AskResponse response = TransportUtils.reliableQueryJobCluster(req, currentServerAddress, workerRuntime.getTransporter());
|
||||||
if (!response.isSuccess()) {
|
if (!response.isSuccess()) {
|
||||||
log.warn("[TaskTracker-{}] detective failed due to ask failed, message is {}", instanceId, response.getMessage());
|
log.warn("[TaskTracker-{}] detective failed due to ask failed, message is {}", instanceId, response.getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
List<String> workerList = JsonUtils.parseObject(response.getData(), new TypeReference<List<String>>() {});
|
List<String> workerList = JsonUtils.parseObject(response.getData(), new TypeReference<List<String>>() {});
|
||||||
ptStatusHolder.register(workerList);
|
ptStatusHolder.register(workerList);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package tech.powerjob.worker.core.tracker.task.light;
|
package tech.powerjob.worker.core.tracker.task.light;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.RandomUtils;
|
import org.apache.commons.lang3.RandomUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -13,7 +12,7 @@ import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
|
|||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.constants.TaskConstant;
|
import tech.powerjob.worker.common.constants.TaskConstant;
|
||||||
import tech.powerjob.worker.common.constants.TaskStatus;
|
import tech.powerjob.worker.common.constants.TaskStatus;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
import tech.powerjob.worker.common.utils.TransportUtils;
|
||||||
import tech.powerjob.worker.core.processor.*;
|
import tech.powerjob.worker.core.processor.*;
|
||||||
import tech.powerjob.worker.core.tracker.manager.LightTaskTrackerManager;
|
import tech.powerjob.worker.core.tracker.manager.LightTaskTrackerManager;
|
||||||
import tech.powerjob.worker.core.tracker.task.TaskTracker;
|
import tech.powerjob.worker.core.tracker.task.TaskTracker;
|
||||||
@ -249,8 +248,6 @@ public class LightTaskTracker extends TaskTracker {
|
|||||||
log.info("[TaskTracker-{}] has been destroyed,final status is {},needn't to report status!", instanceId, status);
|
log.info("[TaskTracker-{}] has been destroyed,final status is {},needn't to report status!", instanceId, status);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String serverPath = AkkaUtils.getServerActorPath(workerRuntime.getServerDiscoveryService().getCurrentServerAddress());
|
|
||||||
ActorSelection serverActor = workerRuntime.getActorSystem().actorSelection(serverPath);
|
|
||||||
TaskTrackerReportInstanceStatusReq reportInstanceStatusReq = new TaskTrackerReportInstanceStatusReq();
|
TaskTrackerReportInstanceStatusReq reportInstanceStatusReq = new TaskTrackerReportInstanceStatusReq();
|
||||||
reportInstanceStatusReq.setAppId(workerRuntime.getAppId());
|
reportInstanceStatusReq.setAppId(workerRuntime.getAppId());
|
||||||
reportInstanceStatusReq.setJobId(instanceInfo.getJobId());
|
reportInstanceStatusReq.setJobId(instanceInfo.getJobId());
|
||||||
@ -303,13 +300,13 @@ public class LightTaskTracker extends TaskTracker {
|
|||||||
reportInstanceStatusReq.setEndTime(taskEndTime);
|
reportInstanceStatusReq.setEndTime(taskEndTime);
|
||||||
// 微操一下,上报最终状态时重新设置下时间,并且增加一小段偏移,保证在并发上报运行中状态以及最终状态时,最终状态的上报时间晚于运行中的状态
|
// 微操一下,上报最终状态时重新设置下时间,并且增加一小段偏移,保证在并发上报运行中状态以及最终状态时,最终状态的上报时间晚于运行中的状态
|
||||||
reportInstanceStatusReq.setReportTime(System.currentTimeMillis() + 1);
|
reportInstanceStatusReq.setReportTime(System.currentTimeMillis() + 1);
|
||||||
reportFinalStatusThenDestroy(serverActor, reportInstanceStatusReq);
|
reportFinalStatusThenDestroy(workerRuntime, reportInstanceStatusReq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 未完成的任务,只需要上报状态
|
// 未完成的任务,只需要上报状态
|
||||||
reportInstanceStatusReq.setInstanceStatus(InstanceStatus.RUNNING.getV());
|
reportInstanceStatusReq.setInstanceStatus(InstanceStatus.RUNNING.getV());
|
||||||
log.info("[TaskTracker-{}] report status({}) success,real status is {}", instanceId, reportInstanceStatusReq, status);
|
log.info("[TaskTracker-{}] report status({}) success,real status is {}", instanceId, reportInstanceStatusReq, status);
|
||||||
serverActor.tell(reportInstanceStatusReq, null);
|
TransportUtils.ttReportInstanceStatus(reportInstanceStatusReq, workerRuntime.getServerDiscoveryService().getCurrentServerAddress(), workerRuntime.getTransporter());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timeoutCheck() {
|
private void timeoutCheck() {
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package tech.powerjob.worker.processor.impl;
|
package tech.powerjob.worker.processor.impl;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import tech.powerjob.common.enums.ProcessorType;
|
import tech.powerjob.common.enums.ProcessorType;
|
||||||
import tech.powerjob.worker.common.WorkerRuntime;
|
import tech.powerjob.worker.common.WorkerRuntime;
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.container.OmsContainer;
|
import tech.powerjob.worker.container.OmsContainer;
|
||||||
import tech.powerjob.worker.container.OmsContainerFactory;
|
import tech.powerjob.worker.container.OmsContainerFactory;
|
||||||
import tech.powerjob.worker.extension.processor.ProcessorBean;
|
import tech.powerjob.worker.extension.processor.ProcessorBean;
|
||||||
@ -45,9 +43,7 @@ public class JarContainerProcessorFactory implements ProcessorFactory {
|
|||||||
|
|
||||||
log.info("[ProcessorFactory] try to load processor({}) in container({})", className, containerName);
|
log.info("[ProcessorFactory] try to load processor({}) in container({})", className, containerName);
|
||||||
|
|
||||||
String serverPath = AkkaUtils.getServerActorPath(workerRuntime.getServerDiscoveryService().getCurrentServerAddress());
|
OmsContainer omsContainer = OmsContainerFactory.fetchContainer(Long.valueOf(containerName), workerRuntime);
|
||||||
ActorSelection actorSelection = workerRuntime.getActorSystem().actorSelection(serverPath);
|
|
||||||
OmsContainer omsContainer = OmsContainerFactory.fetchContainer(Long.valueOf(containerName), actorSelection);
|
|
||||||
if (omsContainer != null) {
|
if (omsContainer != null) {
|
||||||
return new ProcessorBean()
|
return new ProcessorBean()
|
||||||
.setProcessor(omsContainer.getProcessor(className))
|
.setProcessor(omsContainer.getProcessor(className))
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
akka {
|
|
||||||
|
|
||||||
loggers = ["akka.event.slf4j.Slf4jLogger"]
|
|
||||||
loglevel = "WARNING"
|
|
||||||
|
|
||||||
actor {
|
|
||||||
# cluster is better(recommend by official document), but I prefer remote
|
|
||||||
provider = remote
|
|
||||||
allow-java-serialization = off
|
|
||||||
|
|
||||||
serializers {
|
|
||||||
power-serializer = "tech.powerjob.common.serialize.PowerAkkaSerializer"
|
|
||||||
}
|
|
||||||
|
|
||||||
serialization-bindings {
|
|
||||||
"tech.powerjob.common.PowerSerializable" = power-serializer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
remote {
|
|
||||||
artery {
|
|
||||||
transport = tcp # See Selecting a transport below
|
|
||||||
# over write by code
|
|
||||||
canonical.hostname = "127.0.0.1"
|
|
||||||
canonical.port = 25520
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# dispatcher
|
|
||||||
task-tracker-dispatcher {
|
|
||||||
# Dispatcher is the name of the event-based dispatcher
|
|
||||||
type = Dispatcher
|
|
||||||
# What kind of ExecutionService to use
|
|
||||||
executor = "fork-join-executor"
|
|
||||||
# Configuration for the fork join pool
|
|
||||||
fork-join-executor {
|
|
||||||
# Min number of threads to cap factor-based parallelism number to
|
|
||||||
parallelism-min = 2
|
|
||||||
# Parallelism (threads) ... ceil(available processors * factor)
|
|
||||||
parallelism-factor = 4.0
|
|
||||||
# Max number of threads to cap factor-based parallelism number to
|
|
||||||
parallelism-max = 64
|
|
||||||
}
|
|
||||||
# Throughput defines the maximum number of messages to be
|
|
||||||
# processed per actor before the thread jumps to the next actor.
|
|
||||||
# Set to 1 for as fair as possible.
|
|
||||||
throughput = 10
|
|
||||||
}
|
|
||||||
|
|
||||||
processor-tracker-dispatcher {
|
|
||||||
type = Dispatcher
|
|
||||||
executor = "fork-join-executor"
|
|
||||||
fork-join-executor {
|
|
||||||
parallelism-min = 2
|
|
||||||
parallelism-factor = 2.0
|
|
||||||
parallelism-max = 64
|
|
||||||
}
|
|
||||||
throughput = 10
|
|
||||||
}
|
|
||||||
|
|
||||||
worker-common-dispatcher {
|
|
||||||
type = Dispatcher
|
|
||||||
executor = "fork-join-executor"
|
|
||||||
fork-join-executor {
|
|
||||||
parallelism-min = 2
|
|
||||||
parallelism-factor = 2.0
|
|
||||||
parallelism-max = 8
|
|
||||||
}
|
|
||||||
throughput = 10
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
package tech.powerjob.worker.test;
|
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.actor.ActorSystem;
|
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.enums.ExecuteType;
|
|
||||||
import tech.powerjob.common.enums.TimeExpressionType;
|
|
||||||
import tech.powerjob.worker.PowerJobWorker;
|
|
||||||
import tech.powerjob.worker.common.PowerJobWorkerConfig;
|
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.common.utils.NetUtils;
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.typesafe.config.ConfigFactory;
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试完整的 JobInstance 执行流程
|
|
||||||
*
|
|
||||||
* @author tjq
|
|
||||||
* @since 2020/3/25
|
|
||||||
*/
|
|
||||||
public class CommonTaskTrackerTest {
|
|
||||||
|
|
||||||
private static ActorSelection remoteTaskTracker;
|
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
public static void init() throws Exception {
|
|
||||||
|
|
||||||
PowerJobWorkerConfig workerConfig = new PowerJobWorkerConfig();
|
|
||||||
workerConfig.setAppName("oms-test");
|
|
||||||
workerConfig.setServerAddress(Lists.newArrayList("127.0.0.1:7700"));
|
|
||||||
workerConfig.setEnableTestMode(true);
|
|
||||||
|
|
||||||
PowerJobWorker worker = new PowerJobWorker();
|
|
||||||
worker.setConfig(workerConfig);
|
|
||||||
worker.init();
|
|
||||||
|
|
||||||
ActorSystem testAS = ActorSystem.create("oms-test", ConfigFactory.load("oms-akka-test.conf"));
|
|
||||||
String akkaRemotePath = AkkaUtils.getAkkaWorkerPath(NetUtils.getLocalHost() + ":" + RemoteConstant.DEFAULT_WORKER_PORT, RemoteConstant.TASK_TRACKER_ACTOR_NAME);
|
|
||||||
remoteTaskTracker = testAS.actorSelection(akkaRemotePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void justStartWorkerToTestServer() throws Exception {
|
|
||||||
Thread.sleep(277277277);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testStandaloneJob() throws Exception {
|
|
||||||
|
|
||||||
remoteTaskTracker.tell(TestUtils.genServerScheduleJobReq(ExecuteType.STANDALONE, TimeExpressionType.CRON), null);
|
|
||||||
Thread.sleep(5000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMapReduceJob() throws Exception {
|
|
||||||
remoteTaskTracker.tell(TestUtils.genServerScheduleJobReq(ExecuteType.MAP_REDUCE, TimeExpressionType.CRON), null);
|
|
||||||
Thread.sleep(5000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBroadcast() throws Exception {
|
|
||||||
remoteTaskTracker.tell(TestUtils.genServerScheduleJobReq(ExecuteType.BROADCAST, TimeExpressionType.CRON), null);
|
|
||||||
Thread.sleep(5000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,19 +1,10 @@
|
|||||||
package tech.powerjob.worker.test;
|
package tech.powerjob.worker.test;
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.actor.ActorSystem;
|
|
||||||
import tech.powerjob.common.enums.ExecuteType;
|
import tech.powerjob.common.enums.ExecuteType;
|
||||||
import tech.powerjob.common.enums.ProcessorType;
|
import tech.powerjob.common.enums.ProcessorType;
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.utils.NetUtils;
|
import tech.powerjob.common.utils.NetUtils;
|
||||||
import tech.powerjob.worker.PowerJobWorker;
|
|
||||||
import tech.powerjob.worker.common.PowerJobWorkerConfig;
|
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import tech.powerjob.worker.pojo.model.InstanceInfo;
|
import tech.powerjob.worker.pojo.model.InstanceInfo;
|
||||||
import tech.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
|
import tech.powerjob.worker.pojo.request.TaskTrackerStartTaskReq;
|
||||||
import com.typesafe.config.ConfigFactory;
|
|
||||||
import org.junit.jupiter.api.AfterAll;
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动公共服务
|
* 启动公共服务
|
||||||
@ -23,30 +14,6 @@ import org.junit.jupiter.api.BeforeAll;
|
|||||||
*/
|
*/
|
||||||
public class CommonTest {
|
public class CommonTest {
|
||||||
|
|
||||||
protected static ActorSelection remoteProcessorTracker;
|
|
||||||
protected static ActorSelection remoteTaskTracker;
|
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
public static void startWorker() throws Exception {
|
|
||||||
PowerJobWorkerConfig workerConfig = new PowerJobWorkerConfig();
|
|
||||||
workerConfig.setAppName("oms-test");
|
|
||||||
workerConfig.setEnableTestMode(true);
|
|
||||||
|
|
||||||
PowerJobWorker worker = new PowerJobWorker();
|
|
||||||
worker.setConfig(workerConfig);
|
|
||||||
worker.init();
|
|
||||||
|
|
||||||
ActorSystem testAS = ActorSystem.create("oms-test", ConfigFactory.load("oms-akka-test.conf"));
|
|
||||||
String address = NetUtils.getLocalHost() + ":27777";
|
|
||||||
|
|
||||||
remoteProcessorTracker = testAS.actorSelection(AkkaUtils.getAkkaWorkerPath(address, RemoteConstant.PROCESSOR_TRACKER_ACTOR_NAME));
|
|
||||||
remoteTaskTracker = testAS.actorSelection(AkkaUtils.getAkkaWorkerPath(address, RemoteConstant.TASK_TRACKER_ACTOR_NAME));
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterAll
|
|
||||||
public static void stop() throws Exception {
|
|
||||||
Thread.sleep(120000);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TaskTrackerStartTaskReq genTaskTrackerStartTaskReq(String processor) {
|
public static TaskTrackerStartTaskReq genTaskTrackerStartTaskReq(String processor) {
|
||||||
|
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
package tech.powerjob.worker.test;
|
|
||||||
|
|
||||||
import akka.actor.ActorSelection;
|
|
||||||
import akka.actor.ActorSystem;
|
|
||||||
import tech.powerjob.common.enums.ExecuteType;
|
|
||||||
import tech.powerjob.common.RemoteConstant;
|
|
||||||
import tech.powerjob.common.enums.TimeExpressionType;
|
|
||||||
import tech.powerjob.common.utils.NetUtils;
|
|
||||||
import tech.powerjob.worker.PowerJobWorker;
|
|
||||||
import tech.powerjob.worker.common.PowerJobWorkerConfig;
|
|
||||||
import tech.powerjob.worker.common.utils.AkkaUtils;
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.typesafe.config.ConfigFactory;
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* description
|
|
||||||
*
|
|
||||||
* @author tjq
|
|
||||||
* @since 2020/4/9
|
|
||||||
*/
|
|
||||||
public class FrequentTaskTrackerTest {
|
|
||||||
|
|
||||||
private static ActorSelection remoteTaskTracker;
|
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
public static void init() throws Exception {
|
|
||||||
|
|
||||||
PowerJobWorkerConfig workerConfig = new PowerJobWorkerConfig();
|
|
||||||
workerConfig.setAppName("oms-test");
|
|
||||||
workerConfig.setServerAddress(Lists.newArrayList("127.0.0.1:7700"));
|
|
||||||
PowerJobWorker worker = new PowerJobWorker();
|
|
||||||
worker.setConfig(workerConfig);
|
|
||||||
worker.init();
|
|
||||||
|
|
||||||
ActorSystem testAS = ActorSystem.create("oms-test", ConfigFactory.load("oms-akka-test.conf"));
|
|
||||||
String akkaRemotePath = AkkaUtils.getAkkaWorkerPath(NetUtils.getLocalHost() + ":" + RemoteConstant.DEFAULT_WORKER_PORT, RemoteConstant.TASK_TRACKER_ACTOR_NAME);
|
|
||||||
remoteTaskTracker = testAS.actorSelection(akkaRemotePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFixRateJob() throws Exception {
|
|
||||||
remoteTaskTracker.tell(TestUtils.genServerScheduleJobReq(ExecuteType.STANDALONE, TimeExpressionType.FIXED_RATE), null);
|
|
||||||
Thread.sleep(5000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFixDelayJob() throws Exception {
|
|
||||||
remoteTaskTracker.tell(TestUtils.genServerScheduleJobReq(ExecuteType.MAP_REDUCE, TimeExpressionType.FIXED_DELAY), null);
|
|
||||||
Thread.sleep(5000000);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
akka {
|
|
||||||
actor {
|
|
||||||
# for test
|
|
||||||
provider = remote
|
|
||||||
allow-java-serialization = off
|
|
||||||
|
|
||||||
serialization-bindings {
|
|
||||||
"OmsSerializable" = jackson-cbor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
remote {
|
|
||||||
artery {
|
|
||||||
transport = tcp # See Selecting a transport below
|
|
||||||
canonical.hostname = "127.0.0.1"
|
|
||||||
canonical.port = 25521
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user