From d3b8c4e35369f210d5c7570442c7acc6e7d6acc1 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 31 Dec 2022 12:42:57 +0800
Subject: [PATCH 001/100] feat: define powerjob remote
---
pom.xml | 1 +
powerjob-remote/pom.xml | 24 +++++++++++
.../powerjob-remote-framework/pom.xml | 30 ++++++++++++++
.../remote/framework/actor/Actor.java | 21 ++++++++++
.../remote/framework/actor/Handler.java | 21 ++++++++++
.../remote/framework/actor/HandlerInfo.java | 25 ++++++++++++
.../remote/framework/base/Address.java | 21 ++++++++++
.../framework/base/HandlerLocation.java | 27 +++++++++++++
.../framework/base/RemotingException.java | 14 +++++++
.../powerjob/remote/framework/base/URL.java | 21 ++++++++++
.../remote/framework/cs/CSInitializer.java | 34 ++++++++++++++++
.../framework/cs/CSInitializerConfig.java | 22 ++++++++++
.../remote/framework/package-info.java | 7 ++++
.../framework/transporter/Protocol.java | 16 ++++++++
.../framework/transporter/Transporter.java | 40 +++++++++++++++++++
15 files changed, 324 insertions(+)
create mode 100644 powerjob-remote/pom.xml
create mode 100644 powerjob-remote/powerjob-remote-framework/pom.xml
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Actor.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Handler.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializer.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/package-info.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Protocol.java
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Transporter.java
diff --git a/pom.xml b/pom.xml
index 8514171c..e3eb3116 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,6 +44,7 @@
powerjob-worker-spring-boot-starter
powerjob-worker-samples
powerjob-official-processors
+ powerjob-remote
diff --git a/powerjob-remote/pom.xml b/powerjob-remote/pom.xml
new file mode 100644
index 00000000..4e18ce31
--- /dev/null
+++ b/powerjob-remote/pom.xml
@@ -0,0 +1,24 @@
+
+
+
+ powerjob
+ tech.powerjob
+ 3.0.0
+
+ 4.0.0
+ pom
+
+ powerjob-remote-framework
+
+
+ powerjob-remote
+
+
+ 8
+ 8
+ UTF-8
+
+
+
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/pom.xml b/powerjob-remote/powerjob-remote-framework/pom.xml
new file mode 100644
index 00000000..df1512a3
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ powerjob-remote
+ tech.powerjob
+ 3.0.0
+
+ 4.0.0
+
+ powerjob-remote-framework
+
+
+ 8
+ 8
+ UTF-8
+
+ 4.2.0
+
+
+
+
+ tech.powerjob
+ powerjob-common
+ ${powerjob-common.version}
+
+
+
+
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Actor.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Actor.java
new file mode 100644
index 00000000..419b3353
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Actor.java
@@ -0,0 +1,21 @@
+package tech.powerjob.remote.framework.actor;
+
+import java.lang.annotation.*;
+
+/**
+ * 行为处理器
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD})
+public @interface Actor {
+
+ /**
+ * root path
+ * @return root path
+ */
+ String path();
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Handler.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Handler.java
new file mode 100644
index 00000000..4a4a220e
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/Handler.java
@@ -0,0 +1,21 @@
+package tech.powerjob.remote.framework.actor;
+
+import java.lang.annotation.*;
+
+/**
+ * Handler
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD})
+public @interface Handler {
+
+ /**
+ * handler path
+ * @return handler path
+ */
+ String path();
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java
new file mode 100644
index 00000000..76c94c0a
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java
@@ -0,0 +1,25 @@
+package tech.powerjob.remote.framework.actor;
+
+import tech.powerjob.remote.framework.base.HandlerLocation;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+/**
+ * HandlerInfo
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class HandlerInfo implements Serializable {
+
+ private HandlerLocation location;
+ /**
+ * handler 对应的方法
+ */
+ private Method method;
+ /**
+ * actor 对象
+ */
+ private Object actor;
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java
new file mode 100644
index 00000000..0ab57738
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java
@@ -0,0 +1,21 @@
+package tech.powerjob.remote.framework.base;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 地址
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+public class Address implements Serializable {
+ private String host;
+ private int port;
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
new file mode 100644
index 00000000..0bffdadf
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
@@ -0,0 +1,27 @@
+package tech.powerjob.remote.framework.base;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * handler location
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+public class HandlerLocation implements Serializable {
+ /**
+ * 根路径
+ */
+ private String rootPath;
+ /**
+ * 方法路径
+ */
+ private String methodPath;
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java
new file mode 100644
index 00000000..24de209b
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java
@@ -0,0 +1,14 @@
+package tech.powerjob.remote.framework.base;
+
+import java.io.IOException;
+
+/**
+ * RemotingException
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class RemotingException extends IOException {
+
+
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java
new file mode 100644
index 00000000..98487800
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java
@@ -0,0 +1,21 @@
+package tech.powerjob.remote.framework.base;
+
+import java.io.Serializable;
+
+/**
+ * URL
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class URL implements Serializable {
+ /**
+ * remote address
+ */
+ private Address address;
+
+ /**
+ * location
+ */
+ private HandlerLocation location;
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializer.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializer.java
new file mode 100644
index 00000000..421f4d6c
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializer.java
@@ -0,0 +1,34 @@
+package tech.powerjob.remote.framework.cs;
+
+import tech.powerjob.remote.framework.actor.HandlerInfo;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.io.Closeable;
+import java.util.List;
+
+/**
+ * client & server initializer
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public interface CSInitializer extends Closeable {
+
+ /**
+ * initialize the framework
+ * @param config config
+ */
+ void init(CSInitializerConfig config);
+
+ /**
+ * build a Transporter by based network framework
+ * @return Transporter
+ */
+ Transporter buildTransporter();
+
+ /**
+ * bind Actor, publish handler's service
+ * @param handlerInfos handler infos
+ */
+ void bindHandlers(List handlerInfos);
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
new file mode 100644
index 00000000..a48a9078
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
@@ -0,0 +1,22 @@
+package tech.powerjob.remote.framework.cs;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import tech.powerjob.remote.framework.base.Address;
+
+import java.io.Serializable;
+
+/**
+ * CSInitializerConfig
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+public class CSInitializerConfig implements Serializable {
+
+ private Address bindAddress;
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/package-info.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/package-info.java
new file mode 100644
index 00000000..54f6fb30
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * PowerJob 网络框架层
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+package tech.powerjob.remote.framework;
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Protocol.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Protocol.java
new file mode 100644
index 00000000..d014771f
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Protocol.java
@@ -0,0 +1,16 @@
+package tech.powerjob.remote.framework.transporter;
+
+/**
+ * 通讯协议
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public interface Protocol {
+
+ /**
+ * 通讯协议名称
+ * @return 协议名称
+ */
+ String name();
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Transporter.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Transporter.java
new file mode 100644
index 00000000..be69945e
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/transporter/Transporter.java
@@ -0,0 +1,40 @@
+package tech.powerjob.remote.framework.transporter;
+
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.remote.framework.base.RemotingException;
+import tech.powerjob.remote.framework.base.URL;
+
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * 通讯器,封装与远程服务端交互逻辑
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public interface Transporter {
+
+ /**
+ * Protocol
+ * @return return protocol
+ */
+ Protocol getProtocol();
+
+ /**
+ *send message
+ * @param url url
+ * @param request request
+ */
+ void tell(URL url, PowerSerializable request);
+
+ /**
+ * ask by request
+ * @param url url
+ * @param request request
+ * @param executorService thread pool, null is acceptable
+ * @return CompletionStage
+ * @throws RemotingException remote exception
+ */
+ CompletionStage
@@ -25,6 +29,27 @@
powerjob-common
${powerjob-common.version}
+
+
+ org.reflections
+ reflections
+ ${reflections.version}
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.version}
+ test
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+ test
+
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/ActorInfo.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/ActorInfo.java
new file mode 100644
index 00000000..1ce086fd
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/ActorInfo.java
@@ -0,0 +1,28 @@
+package tech.powerjob.remote.framework.actor;
+
+
+/**
+ * ActorInfo
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class ActorInfo {
+
+ private final Object actor;
+
+ private final Actor anno;
+
+ public ActorInfo(Object actor, Actor anno) {
+ this.actor = actor;
+ this.anno = anno;
+ }
+
+ public Object getActor() {
+ return actor;
+ }
+
+ public Actor getAnno() {
+ return anno;
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java
index 76c94c0a..f9e860f3 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/HandlerInfo.java
@@ -1,5 +1,9 @@
package tech.powerjob.remote.framework.actor;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
import tech.powerjob.remote.framework.base.HandlerLocation;
import java.io.Serializable;
@@ -11,7 +15,11 @@ import java.lang.reflect.Method;
* @author tjq
* @since 2022/12/31
*/
-public class HandlerInfo implements Serializable {
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class HandlerInfo {
private HandlerLocation location;
/**
@@ -21,5 +29,5 @@ public class HandlerInfo implements Serializable {
/**
* actor 对象
*/
- private Object actor;
+ private transient ActorInfo actorInfo;
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
index 0bffdadf..8a2ad028 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
@@ -2,6 +2,7 @@ package tech.powerjob.remote.framework.base;
import lombok.Getter;
import lombok.Setter;
+import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
@@ -14,6 +15,7 @@ import java.io.Serializable;
*/
@Getter
@Setter
+@ToString
@Accessors(chain = true)
public class HandlerLocation implements Serializable {
/**
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
new file mode 100644
index 00000000..0e1efa05
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
@@ -0,0 +1,30 @@
+package tech.powerjob.remote.framework.engine;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import tech.powerjob.remote.framework.base.Address;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * EngineConfig
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Data
+@Accessors(chain = true)
+public class EngineConfig implements Serializable {
+
+ /**
+ * 需要启动的引擎类型
+ */
+ private Set types;
+ /**
+ * 绑定的本地地址
+ */
+ private Address bindAddress;
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineOutput.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineOutput.java
new file mode 100644
index 00000000..3d7ee5c0
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineOutput.java
@@ -0,0 +1,18 @@
+package tech.powerjob.remote.framework.engine;
+
+import com.google.common.collect.Maps;
+import lombok.Getter;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.util.Map;
+
+/**
+ * 引擎输出
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Getter
+public class EngineOutput {
+ private Map type2Transport = Maps.newHashMap();
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
new file mode 100644
index 00000000..dbba502b
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
@@ -0,0 +1,12 @@
+package tech.powerjob.remote.framework.engine;
+
+/**
+ * RemoteEngine
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public interface RemoteEngine {
+
+ EngineOutput start(EngineConfig engineConfig);
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java
new file mode 100644
index 00000000..bf641240
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java
@@ -0,0 +1,60 @@
+package tech.powerjob.remote.framework.engine.impl;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.reflections.Reflections;
+import tech.powerjob.common.OmsConstant;
+import tech.powerjob.common.exception.PowerJobException;
+import tech.powerjob.remote.framework.cs.CSInitializer;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * build CSInitializer
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Slf4j
+class CSInitializerFactory {
+
+ static List build(Set types) {
+
+ Reflections reflections = new Reflections(OmsConstant.PACKAGE);
+ Set> cSInitializerClzSet = reflections.getSubTypesOf(CSInitializer.class);
+
+ log.info("[CSInitializerFactory] scan subTypeOf CSInitializer: {}", cSInitializerClzSet);
+
+ List ret = Lists.newArrayList();
+
+ cSInitializerClzSet.forEach(clz -> {
+ try {
+ CSInitializer csInitializer = clz.getDeclaredConstructor().newInstance();
+ String type = csInitializer.type();
+ log.info("[CSInitializerFactory] new instance for CSInitializer[{}] successfully, type={}, object: {}", clz, type, csInitializer);
+ if (types.contains(type)) {
+ ret.add(csInitializer);
+ }
+ } catch (Exception e) {
+ log.error("[CSInitializerFactory] new instance for CSInitializer[{}] failed, maybe you should provide a non-parameter constructor", clz);
+ ExceptionUtils.rethrow(e);
+ }
+ });
+
+ Set loadTypes = ret.stream().map(CSInitializer::type).collect(Collectors.toSet());
+ log.info("[CSInitializerFactory] final load types: {}", loadTypes);
+
+ if (types.size() == ret.size()) {
+ return ret;
+ }
+
+ Set remainTypes = Sets.newHashSet(types);
+ remainTypes.removeAll(loadTypes);
+
+ throw new PowerJobException(String.format("can't load these CSInitializer[%s], ensure your package name start with 'tech.powerjob'!", remainTypes));
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/HandlerFactory.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/HandlerFactory.java
new file mode 100644
index 00000000..e0cb2fb0
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/HandlerFactory.java
@@ -0,0 +1,76 @@
+package tech.powerjob.remote.framework.engine.impl;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.reflections.ReflectionUtils;
+import org.reflections.Reflections;
+import tech.powerjob.common.OmsConstant;
+import tech.powerjob.remote.framework.actor.Actor;
+import tech.powerjob.remote.framework.actor.ActorInfo;
+import tech.powerjob.remote.framework.actor.Handler;
+import tech.powerjob.remote.framework.actor.HandlerInfo;
+import tech.powerjob.remote.framework.base.HandlerLocation;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * load all Actor
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Slf4j
+class HandlerFactory {
+
+ public static List load() {
+ List actorInfos = loadActorInfos();
+ List ret = Lists.newArrayList();
+ actorInfos.forEach(actorInfo -> {
+ Actor anno = actorInfo.getAnno();
+ String rootPath = anno.path();
+ Object actor = actorInfo.getActor();
+ Set allHandlerMethods = ReflectionUtils.getAllMethods(actor.getClass(), (input -> input != null && input.isAnnotationPresent(Handler.class)));
+ allHandlerMethods.forEach(handlerMethod -> {
+ Handler handlerMethodAnnotation = handlerMethod.getAnnotation(Handler.class);
+
+ HandlerLocation handlerLocation = new HandlerLocation()
+ .setRootPath(rootPath)
+ .setMethodPath(handlerMethodAnnotation.path());
+
+
+ HandlerInfo handlerInfo = new HandlerInfo()
+ .setActorInfo(actorInfo)
+ .setMethod(handlerMethod)
+ .setLocation(handlerLocation);
+ ret.add(handlerInfo);
+ });
+
+ });
+ return ret;
+ }
+
+ static List loadActorInfos() {
+ Reflections reflections = new Reflections(OmsConstant.PACKAGE);
+ final Set> typesAnnotatedWith = reflections.getTypesAnnotatedWith(Actor.class);
+
+ List actorInfos = Lists.newArrayList();
+ typesAnnotatedWith.forEach(clz -> {
+ try {
+ final Actor anno = clz.getAnnotation(Actor.class);
+ final Object object = clz.getDeclaredConstructor().newInstance();
+
+ log.info("[ActorFactory] load Actor[clz={},path={}] successfully!", clz, anno.path());
+
+ actorInfos.add(new ActorInfo(object, anno));
+ } catch (Throwable t) {
+ log.error("[ActorFactory] process Actor[{}] failed!", clz);
+ ExceptionUtils.rethrow(t);
+ }
+ });
+
+ return actorInfos;
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
new file mode 100644
index 00000000..9e890265
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
@@ -0,0 +1,51 @@
+package tech.powerjob.remote.framework.engine.impl;
+
+import com.google.common.base.Stopwatch;
+import lombok.extern.slf4j.Slf4j;
+import tech.powerjob.remote.framework.actor.HandlerInfo;
+import tech.powerjob.remote.framework.cs.CSInitializer;
+import tech.powerjob.remote.framework.cs.CSInitializerConfig;
+import tech.powerjob.remote.framework.engine.EngineConfig;
+import tech.powerjob.remote.framework.engine.EngineOutput;
+import tech.powerjob.remote.framework.engine.RemoteEngine;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.util.List;
+
+/**
+ * 初始化 PowerJob 整个网络层
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Slf4j
+public class PowerJobRemoteEngine implements RemoteEngine {
+
+ @Override
+ public EngineOutput start(EngineConfig engineConfig) {
+
+ EngineOutput engineOutput = new EngineOutput();
+ log.info("[PowerJobRemoteEngine] start remote engine with config: {}", engineConfig);
+
+ List handlerInfos = HandlerFactory.load();
+ List csInitializerList = CSInitializerFactory.build(engineConfig.getTypes());
+
+ csInitializerList.forEach(csInitializer -> {
+
+ String type = csInitializer.type();
+
+ Stopwatch sw = Stopwatch.createStarted();
+ log.info("[PowerJobRemoteEngine] try to startup CSInitializer[type={}]", type);
+
+ csInitializer.init(new CSInitializerConfig().setBindAddress(engineConfig.getBindAddress()));
+ Transporter transporter = csInitializer.buildTransporter();
+ engineOutput.getType2Transport().put(type, transporter);
+
+ csInitializer.bindHandlers(handlerInfos);
+
+ log.info("[PowerJobRemoteEngine] startup CSInitializer[type={}] successfully, cost: {}", type, sw);
+ });
+
+ return engineOutput;
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/RemoteEngineTest.java b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/RemoteEngineTest.java
new file mode 100644
index 00000000..983d0893
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/RemoteEngineTest.java
@@ -0,0 +1,28 @@
+package tech.powerjob.remote.framework.engine;
+
+import com.google.common.collect.Sets;
+import org.junit.jupiter.api.Test;
+import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.engine.impl.PowerJobRemoteEngine;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * RemoteEngineTest
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+class RemoteEngineTest {
+
+ @Test
+ void start() {
+
+ RemoteEngine remoteEngine = new PowerJobRemoteEngine();
+
+ EngineConfig engineConfig = new EngineConfig();
+ engineConfig.setTypes(Sets.newHashSet("TEST"));
+ engineConfig.setBindAddress(new Address().setHost("127.0.0.1").setPort(10086));
+ remoteEngine.start(engineConfig);
+ }
+}
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactoryTest.java b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactoryTest.java
new file mode 100644
index 00000000..d970192e
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactoryTest.java
@@ -0,0 +1,29 @@
+package tech.powerjob.remote.framework.engine.impl;
+
+import com.google.common.collect.Sets;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import tech.powerjob.common.exception.PowerJobException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * CSInitializerFactoryTest
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+class CSInitializerFactoryTest {
+
+ @Test
+ void testBuildNormal() {
+ CSInitializerFactory.build(Sets.newHashSet("TEST"));
+ }
+
+ @Test
+ void testNotFind() {
+ Assertions.assertThrows(PowerJobException.class, () -> {
+ CSInitializerFactory.build(Sets.newHashSet("omicron"));
+ });
+ }
+}
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/HandlerFactoryTest.java b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/HandlerFactoryTest.java
new file mode 100644
index 00000000..60c87eb0
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/HandlerFactoryTest.java
@@ -0,0 +1,38 @@
+package tech.powerjob.remote.framework.engine.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import tech.powerjob.remote.framework.actor.ActorInfo;
+import tech.powerjob.remote.framework.actor.HandlerInfo;
+import tech.powerjob.remote.framework.test.TestActor;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * HandlerFactoryTest
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Slf4j
+class HandlerFactoryTest {
+
+ @Test
+ void load() {
+ final List handlerInfos = HandlerFactory.load();
+ log.info("[HandlerFactoryTest] handlerInfos: {}", handlerInfos);
+ }
+
+ @Test
+ void loadActorInfos() {
+ final List actorInfos = HandlerFactory.loadActorInfos();
+ final Set clzNames = actorInfos.stream().map(x -> x.getActor().getClass().getName()).collect(Collectors.toSet());
+ log.info("[HandlerFactoryTest] all load clzNames: {}", clzNames);
+
+ assert clzNames.contains(TestActor.class.getName());
+ }
+}
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/test/TestActor.java b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/test/TestActor.java
new file mode 100644
index 00000000..189e41cf
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/test/TestActor.java
@@ -0,0 +1,31 @@
+package tech.powerjob.remote.framework.test;
+
+import tech.powerjob.remote.framework.actor.Actor;
+import tech.powerjob.remote.framework.actor.Handler;
+
+/**
+ * TestActor
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Actor(path = "/test")
+public class TestActor {
+
+ public static void simpleStaticMethod() {
+ }
+
+ public void simpleMethod() {
+ }
+
+ @Handler(path = "/method1")
+ public String handlerMethod1() {
+ return "1";
+ }
+
+ @Handler(path = "/method2")
+ public String handlerMethod2(String name) {
+ return name;
+ }
+
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/test/TestCSInitializer.java b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/test/TestCSInitializer.java
new file mode 100644
index 00000000..0f09c45a
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/test/TestCSInitializer.java
@@ -0,0 +1,45 @@
+package tech.powerjob.remote.framework.test;
+
+import lombok.extern.slf4j.Slf4j;
+import tech.powerjob.remote.framework.actor.HandlerInfo;
+import tech.powerjob.remote.framework.cs.CSInitializer;
+import tech.powerjob.remote.framework.cs.CSInitializerConfig;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * TestCSInitializer
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+@Slf4j
+public class TestCSInitializer implements CSInitializer {
+ @Override
+ public String type() {
+ return "TEST";
+ }
+
+ @Override
+ public void init(CSInitializerConfig config) {
+ log.info("TestCSInitializer#init");
+ }
+
+ @Override
+ public Transporter buildTransporter() {
+ log.info("TestCSInitializer#buildTransporter");
+ return null;
+ }
+
+ @Override
+ public void bindHandlers(List handlerInfos) {
+ log.info("TestCSInitializer#bindHandlers");
+ }
+
+ @Override
+ public void close() throws IOException {
+ log.info("TestCSInitializer#close");
+ }
+}
From c6d90be839ee25b8bd2a695683620b92d017d883 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 31 Dec 2022 16:34:13 +0800
Subject: [PATCH 004/100] feat: add remote akka impl
---
powerjob-remote/pom.xml | 2 +
.../powerjob-remote-framework/pom.xml | 1 +
.../remote/framework/base/Address.java | 4 +
.../remote/framework/base/ServerType.java | 12 ++
.../powerjob/remote/framework/base/URL.java | 5 +
.../framework/cs/CSInitializerConfig.java | 3 +
.../remote/framework/engine/EngineConfig.java | 2 +
.../engine/impl/PowerJobRemoteEngine.java | 5 +-
.../powerjob-remote-impl-akka/pom.xml | 45 +++++++
.../remote/akka/AkkaCSInitializer.java | 75 ++++++++++++
.../powerjob/remote/akka/AkkaConstant.java | 36 ++++++
.../powerjob/remote/akka/AkkaProtocol.java | 16 +++
.../powerjob/remote/akka/AkkaTransporter.java | 81 +++++++++++++
.../remote/akka/AkkaTroubleshootingActor.java | 25 ++++
.../powerjob/remote/akka/package-info.java | 8 ++
.../src/main/resources/powerjob.akka.conf | 112 ++++++++++++++++++
.../powerjob-remote-impl-http/pom.xml | 20 ++++
17 files changed, 451 insertions(+), 1 deletion(-)
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/ServerType.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/pom.xml
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaConstant.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProtocol.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaTransporter.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaTroubleshootingActor.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/package-info.java
create mode 100644 powerjob-remote/powerjob-remote-impl-akka/src/main/resources/powerjob.akka.conf
create mode 100644 powerjob-remote/powerjob-remote-impl-http/pom.xml
diff --git a/powerjob-remote/pom.xml b/powerjob-remote/pom.xml
index 4e18ce31..ee3e7b8b 100644
--- a/powerjob-remote/pom.xml
+++ b/powerjob-remote/pom.xml
@@ -11,6 +11,8 @@
pom
powerjob-remote-framework
+ powerjob-remote-impl-http
+ powerjob-remote-impl-akka
powerjob-remote
diff --git a/powerjob-remote/powerjob-remote-framework/pom.xml b/powerjob-remote/powerjob-remote-framework/pom.xml
index 542fc0e5..146d671f 100644
--- a/powerjob-remote/powerjob-remote-framework/pom.xml
+++ b/powerjob-remote/powerjob-remote-framework/pom.xml
@@ -9,6 +9,7 @@
4.0.0
+ 4.2.0
powerjob-remote-framework
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java
index 0ab57738..71edbc36 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/Address.java
@@ -18,4 +18,8 @@ import java.io.Serializable;
public class Address implements Serializable {
private String host;
private int port;
+
+ public String toFullAddress() {
+ return String.format("%s:%d", host, port);
+ }
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/ServerType.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/ServerType.java
new file mode 100644
index 00000000..2b57212f
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/ServerType.java
@@ -0,0 +1,12 @@
+package tech.powerjob.remote.framework.base;
+
+/**
+ * 服务器类型类型
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public enum ServerType {
+ SERVER,
+ WORKER
+}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java
index 98487800..24e71b64 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/URL.java
@@ -1,5 +1,8 @@
package tech.powerjob.remote.framework.base;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
import java.io.Serializable;
/**
@@ -8,6 +11,8 @@ import java.io.Serializable;
* @author tjq
* @since 2022/12/31
*/
+@Data
+@Accessors(chain = true)
public class URL implements Serializable {
/**
* remote address
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
index a48a9078..a64051fd 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
@@ -4,6 +4,7 @@ import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.base.ServerType;
import java.io.Serializable;
@@ -19,4 +20,6 @@ import java.io.Serializable;
public class CSInitializerConfig implements Serializable {
private Address bindAddress;
+
+ private ServerType serverType;
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
index 0e1efa05..4120f7ea 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
@@ -5,6 +5,7 @@ import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.base.ServerType;
import java.io.Serializable;
import java.util.Set;
@@ -19,6 +20,7 @@ import java.util.Set;
@Accessors(chain = true)
public class EngineConfig implements Serializable {
+ private ServerType serverType;
/**
* 需要启动的引擎类型
*/
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
index 9e890265..1ee8cc44 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
@@ -37,7 +37,10 @@ public class PowerJobRemoteEngine implements RemoteEngine {
Stopwatch sw = Stopwatch.createStarted();
log.info("[PowerJobRemoteEngine] try to startup CSInitializer[type={}]", type);
- csInitializer.init(new CSInitializerConfig().setBindAddress(engineConfig.getBindAddress()));
+ csInitializer.init(new CSInitializerConfig()
+ .setBindAddress(engineConfig.getBindAddress())
+ .setServerType(engineConfig.getServerType())
+ );
Transporter transporter = csInitializer.buildTransporter();
engineOutput.getType2Transport().put(type, transporter);
diff --git a/powerjob-remote/powerjob-remote-impl-akka/pom.xml b/powerjob-remote/powerjob-remote-impl-akka/pom.xml
new file mode 100644
index 00000000..e422b0c8
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-akka/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+ powerjob-remote
+ tech.powerjob
+ 3.0.0
+
+ 4.0.0
+
+ powerjob-remote-impl-akka
+ 4.2.0
+
+
+ 8
+ 8
+ UTF-8
+
+ 4.2.0
+
+ 2.6.12
+
+
+
+
+ tech.powerjob
+ powerjob-remote-framework
+ ${powerjob-remote-framework.version}
+
+
+
+
+ com.typesafe.akka
+ akka-remote_2.13
+ ${akka.version}
+
+
+ com.typesafe.akka
+ akka-slf4j_2.13
+ ${akka.version}
+
+
+
+
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java
new file mode 100644
index 00000000..ae6e201c
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java
@@ -0,0 +1,75 @@
+package tech.powerjob.remote.akka;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.actor.DeadLetter;
+import akka.actor.Props;
+import com.google.common.collect.Maps;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import tech.powerjob.remote.framework.actor.HandlerInfo;
+import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.base.ServerType;
+import tech.powerjob.remote.framework.cs.CSInitializer;
+import tech.powerjob.remote.framework.cs.CSInitializerConfig;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * AkkaCSInitializer
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class AkkaCSInitializer implements CSInitializer {
+
+ private ActorSystem actorSystem;
+ private CSInitializerConfig config;
+
+ @Override
+ public String type() {
+ return AkkaConstant.PROTOCOL;
+ }
+
+ @Override
+ public void init(CSInitializerConfig config) {
+
+ this.config = config;
+
+ Address bindAddress = config.getBindAddress();
+
+ // 初始化 ActorSystem(macOS上 new ServerSocket 检测端口占用的方法并不生效,可能是AKKA是Scala写的缘故?没办法...只能靠异常重试了)
+ Map overrideConfig = Maps.newHashMap();
+ overrideConfig.put("akka.remote.artery.canonical.hostname", bindAddress.getHost());
+ overrideConfig.put("akka.remote.artery.canonical.port", bindAddress.getPort());
+
+ Config akkaBasicConfig = ConfigFactory.load(AkkaConstant.AKKA_CONFIG);
+ Config akkaFinalConfig = ConfigFactory.parseMap(overrideConfig).withFallback(akkaBasicConfig);
+
+ // 启动时绑定当前的 actorSystemName
+ String actorSystemName = AkkaConstant.fetchActorSystemName(config.getServerType(), false);
+ this.actorSystem = ActorSystem.create(actorSystemName, akkaFinalConfig);
+
+ // 处理系统中产生的异常情况
+ ActorRef troubleshootingActor = actorSystem.actorOf(Props.create(AkkaTroubleshootingActor.class), "troubleshooting");
+ actorSystem.eventStream().subscribe(troubleshootingActor, DeadLetter.class);
+ }
+
+ @Override
+ public Transporter buildTransporter() {
+ return new AkkaTransporter(config.getServerType(), actorSystem);
+ }
+
+ @Override
+ public void bindHandlers(List handlerInfos) {
+
+ }
+
+ @Override
+ public void close() throws IOException {
+ actorSystem.terminate();
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaConstant.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaConstant.java
new file mode 100644
index 00000000..425f6981
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaConstant.java
@@ -0,0 +1,36 @@
+package tech.powerjob.remote.akka;
+
+import tech.powerjob.remote.framework.base.ServerType;
+
+/**
+ * AkkaConstant
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class AkkaConstant {
+
+ public static final String PROTOCOL = "AKKA";
+
+ public static final String AKKA_CONFIG = "powerjob.akka.conf";
+
+ public static final String WORKER_ACTOR_SYSTEM_NAME = "oms";
+ public static final String SERVER_ACTOR_SYSTEM_NAME = "oms-server";
+
+ /**
+ * 获取 actorSystem 名称
+ * @param serverType 当前服务器类型,powerjob-server 为 server,powerjob-worker 为 worker
+ * @param reversed 是否反向输出,默认输出当前服务器对应的 actorSystemName,reversed = true 后倒置为目标服务器的 actorSystemName
+ * @return actorSystemName
+ */
+ public static String fetchActorSystemName(ServerType serverType, boolean reversed) {
+
+ boolean outputServer = serverType == ServerType.SERVER;
+ if (reversed) {
+ outputServer = !outputServer;
+ }
+
+ return outputServer ? SERVER_ACTOR_SYSTEM_NAME : WORKER_ACTOR_SYSTEM_NAME;
+ }
+
+}
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProtocol.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProtocol.java
new file mode 100644
index 00000000..e2e04c0b
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProtocol.java
@@ -0,0 +1,16 @@
+package tech.powerjob.remote.akka;
+
+import tech.powerjob.remote.framework.transporter.Protocol;
+
+/**
+ * AkkaProtocol
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class AkkaProtocol implements Protocol {
+ @Override
+ public String name() {
+ return AkkaConstant.PROTOCOL;
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaTransporter.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaTransporter.java
new file mode 100644
index 00000000..b03358f8
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaTransporter.java
@@ -0,0 +1,81 @@
+package tech.powerjob.remote.akka;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.pattern.Patterns;
+import com.google.common.collect.Maps;
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.common.RemoteConstant;
+import tech.powerjob.common.utils.CommonUtils;
+import tech.powerjob.remote.framework.base.RemotingException;
+import tech.powerjob.remote.framework.base.ServerType;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.remote.framework.transporter.Protocol;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.time.Duration;
+import java.util.Map;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * AkkaTransporter
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class AkkaTransporter implements Transporter {
+
+ private final ServerType serverType;
+ private final ActorSystem actorSystem;
+
+ private final String targetActorSystemName;
+
+ /**
+ * akka://@:/
+ */
+ private static final String AKKA_NODE_PATH = "akka://%s@%s/user/%s";
+
+ private static final Map SERVER_PATH_MAP = Maps.newHashMap();
+ private static final Map WORKER_PATH_MAP = Maps.newHashMap();
+
+ static {
+ SERVER_PATH_MAP.put("", "");
+
+ WORKER_PATH_MAP.put("", "");
+ }
+
+ public AkkaTransporter(ServerType serverType, ActorSystem actorSystem) {
+ this.actorSystem = actorSystem;
+ this.serverType = serverType;
+ this.targetActorSystemName = AkkaConstant.fetchActorSystemName(serverType, true);
+ }
+
+ @Override
+ public Protocol getProtocol() {
+ return new AkkaProtocol();
+ }
+
+ @Override
+ public void tell(URL url, PowerSerializable request) {
+ ActorSelection actorSelection = fetchActorSelection(url);
+ actorSelection.tell(request, null);
+ }
+
+ @Override
+ public CompletionStage
+
+
+
+ tech.powerjob
+ powerjob-remote-framework
+ ${powerjob-remote-framework.version}
+
+
+
+
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java
new file mode 100644
index 00000000..3d28f9aa
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java
@@ -0,0 +1,43 @@
+package tech.powerjob.remote.http;
+
+import tech.powerjob.remote.framework.actor.ActorInfo;
+import tech.powerjob.remote.framework.cs.CSInitializer;
+import tech.powerjob.remote.framework.cs.CSInitializerConfig;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * HttpCSInitializer
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class HttpCSInitializer implements CSInitializer {
+
+ @Override
+ public String type() {
+ return null;
+ }
+
+ @Override
+ public void init(CSInitializerConfig config) {
+
+ }
+
+ @Override
+ public Transporter buildTransporter() {
+ return null;
+ }
+
+ @Override
+ public void bindHandlers(List actorInfos) {
+
+ }
+
+ @Override
+ public void close() throws IOException {
+
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java
new file mode 100644
index 00000000..0b15a8a8
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java
@@ -0,0 +1,17 @@
+package tech.powerjob.remote.http;
+
+import tech.powerjob.remote.framework.transporter.Protocol;
+
+/**
+ * HttpProtocol
+ *
+ * @author tjq
+ * @since 2022/12/31
+ */
+public class HttpProtocol implements Protocol {
+
+ @Override
+ public String name() {
+ return null;
+ }
+}
From eb6b0c35a546d3d7ab31eb6210260300fa6b3ae8 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 1 Jan 2023 09:41:13 +0800
Subject: [PATCH 008/100] feat: add BenchmarkActor for performance test
---
.../remote/framework/BenchmarkActor.java | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
new file mode 100644
index 00000000..e0b54b30
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
@@ -0,0 +1,20 @@
+package tech.powerjob.remote.framework;
+
+import tech.powerjob.remote.framework.actor.Actor;
+import tech.powerjob.remote.framework.actor.Handler;
+
+/**
+ * 基准测试
+ *
+ * @author tjq
+ * @since 2023/1/1
+ */
+@Actor(path = "benchmark")
+public class BenchmarkActor {
+
+ @Handler(path = "simple")
+ public String simpleRequest(String k) {
+ return k;
+ }
+
+}
From 268f5dd5c7045b277cba068462c339a99ac51db2 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 1 Jan 2023 10:25:58 +0800
Subject: [PATCH 009/100] feat: add BenchmarkActor for performance test
---
.../remote/framework/BenchmarkActor.java | 55 +++++++++++++++++++
.../powerjob-remote-impl-http/pom.xml | 16 ++++++
2 files changed, 71 insertions(+)
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
index e0b54b30..861cf64a 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
@@ -1,5 +1,11 @@
package tech.powerjob.remote.framework;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.RandomStringUtils;
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.common.utils.CommonUtils;
import tech.powerjob.remote.framework.actor.Actor;
import tech.powerjob.remote.framework.actor.Handler;
@@ -9,6 +15,7 @@ import tech.powerjob.remote.framework.actor.Handler;
* @author tjq
* @since 2023/1/1
*/
+@Slf4j
@Actor(path = "benchmark")
public class BenchmarkActor {
@@ -17,4 +24,52 @@ public class BenchmarkActor {
return k;
}
+ @Handler(path = "standard")
+ public BenchmarkResponse processStandardRequest(BenchmarkRequest request) {
+ log.info("[BenchmarkActor] receive request: {}", request);
+ BenchmarkResponse response = new BenchmarkResponse()
+ .setSuccess(true)
+ .setContent(request.getContent())
+ .setProcessThread(Thread.currentThread().getName())
+ .setServerReceiveTs(System.currentTimeMillis());
+ if (request.getResponseSize() != 0 && request.getResponseSize() > 0) {
+ response.setExtra(RandomStringUtils.random(request.getResponseSize()));
+ }
+ if (request.getBlockingMills() !=0 && request.getBlockingMills() > 0) {
+ CommonUtils.easySleep(request.getBlockingMills());
+ }
+ return response;
+ }
+
+
+ @Data
+ public static class BenchmarkRequest implements PowerSerializable {
+ /**
+ * 请求内容
+ */
+ private String content;
+ /**
+ * 期望的响应大小,可空
+ */
+ private Integer responseSize;
+ /**
+ * 阻塞时间,模拟 IO 耗时
+ */
+ private Integer blockingMills;
+ }
+
+ @Data
+ @Accessors(chain = true)
+ public static class BenchmarkResponse implements PowerSerializable {
+ private boolean success;
+ /**
+ * 原路返回原来的 content
+ */
+ private String content;
+
+ private String processThread;
+ private long serverReceiveTs;
+
+ private String extra;
+ }
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/pom.xml b/powerjob-remote/powerjob-remote-impl-http/pom.xml
index 489b01a9..387b5559 100644
--- a/powerjob-remote/powerjob-remote-impl-http/pom.xml
+++ b/powerjob-remote/powerjob-remote-impl-http/pom.xml
@@ -16,6 +16,7 @@
8
UTF-8
+ 4.3.7
4.2.0
@@ -27,6 +28,21 @@
${powerjob-remote-framework.version}
+
+
+ io.vertx
+ vertx-core
+ ${vertx.version}
+
+
+
+ io.vertx
+ vertx-web
+ ${vertx.version}
+
+
+
+
\ No newline at end of file
From 87a1a1d7c1b79f2cc052b80548f7cc76626e51a8 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 1 Jan 2023 20:12:00 +0800
Subject: [PATCH 010/100] feat: vertx http framwork
---
.../framework/base/HandlerLocation.java | 4 +
.../framework/base/RemotingException.java | 6 +-
.../remote/http/HttpCSInitializer.java | 22 ++++-
.../powerjob/remote/http/HttpProtocol.java | 2 +-
.../tech/powerjob/remote/http/vertx/Test.java | 46 +++++++++
.../remote/http/vertx/VertxInitializer.java | 51 ++++++++++
.../remote/http/vertx/VertxTransporter.java | 99 +++++++++++++++++++
7 files changed, 223 insertions(+), 7 deletions(-)
create mode 100644 powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/Test.java
create mode 100644 powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java
create mode 100644 powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
index 8a2ad028..6f9cc5ba 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/HandlerLocation.java
@@ -26,4 +26,8 @@ public class HandlerLocation implements Serializable {
* 方法路径
*/
private String methodPath;
+
+ public String toPath() {
+ return String.format("/%s/%s", rootPath, methodPath);
+ }
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java
index 24de209b..fd3185db 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/base/RemotingException.java
@@ -8,7 +8,9 @@ import java.io.IOException;
* @author tjq
* @since 2022/12/31
*/
-public class RemotingException extends IOException {
-
+public class RemotingException extends RuntimeException {
+ public RemotingException(String message) {
+ super(message);
+ }
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java
index 3d28f9aa..1185121e 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpCSInitializer.java
@@ -1,9 +1,15 @@
package tech.powerjob.remote.http;
+import io.vertx.core.Vertx;
+import io.vertx.core.VertxOptions;
+import io.vertx.core.http.HttpClient;
+import io.vertx.core.http.HttpServer;
import tech.powerjob.remote.framework.actor.ActorInfo;
import tech.powerjob.remote.framework.cs.CSInitializer;
import tech.powerjob.remote.framework.cs.CSInitializerConfig;
import tech.powerjob.remote.framework.transporter.Transporter;
+import tech.powerjob.remote.http.vertx.VertxInitializer;
+import tech.powerjob.remote.http.vertx.VertxTransporter;
import java.io.IOException;
import java.util.List;
@@ -16,19 +22,25 @@ import java.util.List;
*/
public class HttpCSInitializer implements CSInitializer {
+ private Vertx vertx;
+ private HttpServer httpServer;
+ private HttpClient httpClient;
+
@Override
public String type() {
- return null;
+ return tech.powerjob.common.enums.Protocol.HTTP.name();
}
@Override
public void init(CSInitializerConfig config) {
-
+ vertx = VertxInitializer.buildVertx();
+ httpServer = VertxInitializer.buildHttpServer(vertx);
+ httpClient = VertxInitializer.buildHttpClient(vertx);
}
@Override
public Transporter buildTransporter() {
- return null;
+ return new VertxTransporter(httpClient);
}
@Override
@@ -38,6 +50,8 @@ public class HttpCSInitializer implements CSInitializer {
@Override
public void close() throws IOException {
-
+ vertx.close();
+ httpServer.close();
+ httpClient.close();
}
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java
index 0b15a8a8..2e874652 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpProtocol.java
@@ -12,6 +12,6 @@ public class HttpProtocol implements Protocol {
@Override
public String name() {
- return null;
+ return tech.powerjob.common.enums.Protocol.HTTP.name();
}
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/Test.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/Test.java
new file mode 100644
index 00000000..227c3a1b
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/Test.java
@@ -0,0 +1,46 @@
+package tech.powerjob.remote.http.vertx;
+
+import io.vertx.core.Vertx;
+import io.vertx.core.http.HttpServer;
+import io.vertx.core.json.JsonObject;
+import io.vertx.ext.web.Router;
+import io.vertx.ext.web.handler.BodyHandler;
+
+import java.util.Map;
+
+/**
+ * description
+ *
+ * @author tjq
+ * @since 2023/1/1
+ */
+public class Test {
+
+ public static void main(String[] args) {
+ final Vertx vertx = Vertx.vertx();
+ final HttpServer httpServer = vertx.createHttpServer();
+
+ final Router router = Router.router(vertx);
+ router.route().handler(BodyHandler.create());
+ router.post("/test/abc").handler(ctx -> {
+
+ final Map data = ctx.data();
+ System.out.println("ctx.data: " + data);
+ final String body = ctx.body().asString();
+ System.out.println("request: " + body);
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.put("aa", "vv");
+
+
+// ctx.end(jsonObject.toBuffer());
+ ctx.fail(404);
+ ctx.end("failedFromServer");
+ });
+
+ httpServer
+ .requestHandler(router)
+ .exceptionHandler(e -> e.printStackTrace())
+ .listen(7890);
+ System.out.println("aa");
+ }
+}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java
new file mode 100644
index 00000000..c7aa9dfd
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java
@@ -0,0 +1,51 @@
+package tech.powerjob.remote.http.vertx;
+
+import io.vertx.core.Vertx;
+import io.vertx.core.VertxOptions;
+import io.vertx.core.http.HttpClient;
+import io.vertx.core.http.HttpClientOptions;
+import io.vertx.core.http.HttpServer;
+import io.vertx.core.http.HttpServerOptions;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * VertxInitializer
+ * PowerJob 只是将 vertx 作为 toolkit 使用
+ *
+ * @author tjq
+ * @since 2023/1/1
+ */
+@Slf4j
+public class VertxInitializer {
+
+ public static Vertx buildVertx() {
+ VertxOptions options = new VertxOptions();
+ log.info("[PowerJob-Vertx] use vertx options: {}", options);
+ return Vertx.vertx(options);
+ }
+
+ public static HttpServer buildHttpServer(Vertx vertx) {
+ HttpServerOptions httpServerOptions = new HttpServerOptions();
+ tryEnableCompression(httpServerOptions);
+ log.info("[PowerJob-Vertx] use HttpServerOptions: {}", httpServerOptions);
+ return vertx.createHttpServer(httpServerOptions);
+ }
+ private static void tryEnableCompression(HttpServerOptions httpServerOptions) {
+ // 非核心组件,不直接依赖类(无 import),加载报错可忽略
+ try {
+ httpServerOptions
+ .addCompressor(io.netty.handler.codec.compression.StandardCompressionOptions.gzip())
+ .setCompressionSupported(true);
+ log.warn("[PowerJob-Vertx] enable server side compression successfully!");
+ } catch (Exception e) {
+ log.warn("[PowerJob-Vertx] enable server side compression failed!", e);
+ }
+ }
+
+ public static HttpClient buildHttpClient(Vertx vertx) {
+ HttpClientOptions httpClientOptions = new HttpClientOptions();
+ log.info("[PowerJob-Vertx] use HttpClientOptions: {}", httpClientOptions);
+ return vertx.createHttpClient(httpClientOptions);
+ }
+
+}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java
new file mode 100644
index 00000000..eaadd5ab
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java
@@ -0,0 +1,99 @@
+package tech.powerjob.remote.http.vertx;
+
+import io.netty.handler.codec.http.HttpResponseStatus;
+import io.vertx.core.Future;
+import io.vertx.core.Vertx;
+import io.vertx.core.http.*;
+import io.vertx.core.json.JsonObject;
+import lombok.SneakyThrows;
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.common.request.ServerScheduleJobReq;
+import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.base.HandlerLocation;
+import tech.powerjob.remote.framework.base.RemotingException;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.remote.framework.transporter.Protocol;
+import tech.powerjob.remote.framework.transporter.Transporter;
+import tech.powerjob.remote.http.HttpProtocol;
+
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * VertxTransporter
+ *
+ * @author tjq
+ * @since 2023/1/1
+ */
+public class VertxTransporter implements Transporter {
+
+ private final HttpClient httpClient;
+
+ private static final Protocol PROTOCOL = new HttpProtocol();
+
+ public VertxTransporter(HttpClient httpClient) {
+ this.httpClient = httpClient;
+ }
+
+ @Override
+ public Protocol getProtocol() {
+ return PROTOCOL;
+ }
+
+ @Override
+ public void tell(URL url, PowerSerializable request) {
+ post(url, request);
+ }
+
+ @Override
+ public CompletionStage
*/
private String serverAddress;
+ /**
+ * Protocol for communication between WORKER and server
+ */
+ private Protocol protocol = Protocol.AKKA;
/**
* Local store strategy for H2 database. {@code disk} or {@code memory}.
*/
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsJarContainer.java b/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsJarContainer.java
index 2bd27648..8265ac83 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsJarContainer.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsJarContainer.java
@@ -38,7 +38,7 @@ public class OmsJarContainer implements OmsContainer {
private OhMyClassLoader containerClassLoader;
private ClassPathXmlApplicationContext container;
- private Map processorCache = Maps.newConcurrentMap();
+ private final Map processorCache = Maps.newConcurrentMap();
public OmsJarContainer(Long containerId, String name, String version, File localJarFile) {
this.containerId = containerId;
From b013fbfefd74f1c7fbfd10289fd54def1c810792 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 10:28:11 +0800
Subject: [PATCH 059/100] feat: replace akka by PowerJobRemoteEngine in server
side
---
.../tech/powerjob/common/RemoteConstant.java | 26 ++-
.../remote/akka/AkkaMappingService.java | 3 +-
.../powerjob/remote/akka/AkkaProxyActor.java | 10 +-
powerjob-server/pom.xml | 21 ++-
.../powerjob/server/core/DispatchService.java | 7 +-
.../core/container/ContainerService.java | 63 +++----
.../core/handler/IWorkerRequestHandler.java | 14 +-
.../handler/WorkerRequestHandlerImpl.java | 3 +
.../server/core/handler/impl/Initializer.java | 28 ---
.../server/core/instance/InstanceManager.java | 10 +-
.../server/core/instance/InstanceService.java | 14 +-
.../scheduler/InstanceStatusCheckService.java | 14 +-
.../core/scheduler/PowerScheduleService.java | 12 +-
.../server/remote/actoes/ServerActor.java | 10 ++
.../server/remote/server/FriendActor.java | 52 ++++++
.../remote/server/FriendRequestHandler.java | 86 ---------
.../election/ServerElectionService.java | 52 +++---
.../redirector/DesignateServerAspect.java | 30 ++--
.../remote/tp/PowerTransportService.java | 169 ++++++++++++++++++
.../server/remote/tp/ProtocolInfo.java | 28 +++
.../server/remote/tp/ServerURLFactory.java | 52 ++++++
.../server/remote/tp/TransportService.java | 29 +++
.../remote/transport/TransportService.java | 66 -------
.../server/remote/transport/Transporter.java | 22 ---
.../transport/impl/AkkaTransporter.java | 48 -----
.../transport/impl/HttpTransporter.java | 73 --------
.../remote/transport/starter/AkkaStarter.java | 88 ---------
.../transport/starter/VertXStarter.java | 47 -----
.../server/PowerJobServerApplication.java | 5 -
.../web/controller/ContainerController.java | 41 ++---
.../web/controller/ServerController.java | 4 +-
.../src/main/resources/application.properties | 1 +
.../worker/common/utils/TransportUtils.java | 12 +-
33 files changed, 530 insertions(+), 610 deletions(-)
delete mode 100644 powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/Initializer.java
create mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java
create mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendRequestHandler.java
create mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java
create mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java
create mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java
create mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/TransportService.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/Transporter.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/AkkaTransporter.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/HttpTransporter.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/AkkaStarter.java
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/VertXStarter.java
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java b/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java
index f2f2e5ff..a2d751ec 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java
@@ -29,31 +29,43 @@ public class RemoteConstant {
public static final String EMPTY_ADDRESS = "N/A";
public static final long DEFAULT_TIMEOUT_MS = 5000;
- /* ************************ SERVER ************************ */
- public static final String SERVER_PATH = "server";
+ /* ************************ SERVER-self_side (s4s == server for server side) ************************ */
+ public static final String S4S_PATH = "friend";
+
+ /**
+ * server 集群间的心跳处理
+ */
+ public static final String S4S_HANDLER_PING = "ping";
+ /**
+ * 处理其他 server 的执行请求
+ */
+ public static final String S4S_HANDLER_PROCESS = "process";
+
+ /* ************************ SERVER-worker_side(s4w == server for worker side) ************************ */
+ public static final String S4W_PATH = "server";
/**
* server 处理在线日志
*/
- public static final String SERVER_HANDLER_REPORT_LOG = "reportLog";
+ public static final String S4W_HANDLER_REPORT_LOG = "reportLog";
/**
* server 处理 worker 心跳
*/
- public static final String SERVER_HANDLER_WORKER_HEARTBEAT = "workerHeartbeat";
+ public static final String S4W_HANDLER_WORKER_HEARTBEAT = "workerHeartbeat";
/**
* server 处理 TaskTracker 上报的任务实例状态
*/
- public static final String SERVER_HANDLER_REPORT_INSTANCE_STATUS = "reportInstanceStatus";
+ public static final String S4W_HANDLER_REPORT_INSTANCE_STATUS = "reportInstanceStatus";
/**
* server 查询任务的可执行集群
*/
- public static final String SERVER_HANDLER_QUERY_JOB_CLUSTER = "queryJobCluster";
+ public static final String S4W_HANDLER_QUERY_JOB_CLUSTER = "queryJobCluster";
/**
* server 处理 worker 请求部署容器命令
*/
- public static final String SERVER_HANDLER_WORKER_NEED_DEPLOY_CONTAINER = "container";
+ public static final String S4W_HANDLER_WORKER_NEED_DEPLOY_CONTAINER = "queryContainer";
/* ************************ Worker-TaskTracker ************************ */
public static final String WTT_PATH = "taskTracker";
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java
index 904b47f2..ac4392d6 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java
@@ -22,7 +22,8 @@ public class AkkaMappingService {
private static final Map RP_2_ACTOR_CFG = Maps.newHashMap();
static {
- addMappingRule(RemoteConstant.SERVER_PATH, "server_actor", null);
+ addMappingRule(RemoteConstant.S4W_PATH, "server_actor", "w-r-c-d");
+ addMappingRule(RemoteConstant.S4S_PATH, "friend_actor", "friend-request-actor-dispatcher");
}
private static final String DEFAULT_DISPATCH_NAME = "common-dispatcher";
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java
index 15700cc0..b2d2fc5e 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java
@@ -55,9 +55,15 @@ public class AkkaProxyActor extends AbstractActor {
try {
final Object ret = handlerInfo.getMethod().invoke(actorInfo.getActor(), req);
- if (ret != null) {
- getSender().tell(ret, getSelf());
+ if (ret == null) {
+ return;
}
+ if (ret instanceof Optional) {
+ if (!((Optional>) ret).isPresent()) {
+ return;
+ }
+ }
+ getSender().tell(ret, getSelf());
} catch (Exception e) {
log.error("[PowerJob-AKKA] process failed!", e);
}
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index 37f64bbc..dedfefba 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -28,7 +28,7 @@
2.9.2
2.7.4
- 4.2.1
+
8.0.30
19.7.0.0
@@ -50,6 +50,8 @@
3.0.10
9.1.6
+ 4.2.1
+ 4.2.1
@@ -99,11 +101,16 @@
-
+
tech.powerjob
- powerjob-common
- ${powerjob.common.version}
+ powerjob-remote-impl-http
+ ${powerjob-remote-impl-http.version}
+
+
+ tech.powerjob
+ powerjob-remote-impl-akka
+ ${powerjob-remote-impl-akka.version}
@@ -267,6 +274,12 @@
io.springfox
springfox-swagger2
${swagger.version}
+
+
+ guava
+ com.google.guava
+
+
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
index 4a80cf87..29f10c7b 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
@@ -11,6 +11,7 @@ import tech.powerjob.common.RemoteConstant;
import tech.powerjob.common.SystemInstanceResult;
import tech.powerjob.common.enums.*;
import tech.powerjob.common.request.ServerScheduleJobReq;
+import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.common.Holder;
import tech.powerjob.server.common.module.WorkerInfo;
import tech.powerjob.server.core.instance.InstanceManager;
@@ -19,7 +20,8 @@ import tech.powerjob.server.core.lock.UseCacheLock;
import tech.powerjob.server.persistence.remote.model.InstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
-import tech.powerjob.server.remote.transport.TransportService;
+import tech.powerjob.server.remote.tp.ServerURLFactory;
+import tech.powerjob.server.remote.tp.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.ArrayList;
@@ -165,7 +167,8 @@ public class DispatchService {
WorkerInfo taskTracker = suitableWorkers.get(0);
String taskTrackerAddress = taskTracker.getAddress();
- transportService.tell(Protocol.of(taskTracker.getProtocol()), taskTrackerAddress, req);
+ URL workerUrl = ServerURLFactory.dispatchJob2Worker(taskTrackerAddress);
+ transportService.tell(taskTracker.getProtocol(), workerUrl, req);
log.info("[Dispatcher-{}|{}] send schedule request to TaskTracker[protocol:{},address:{}] successfully: {}.", jobId, instanceId, taskTracker.getProtocol(), taskTrackerAddress, req);
// 修改状态
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
index 56dc22ee..89875876 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
@@ -1,25 +1,5 @@
package tech.powerjob.server.core.container;
-import tech.powerjob.common.OmsConstant;
-import tech.powerjob.common.enums.Protocol;
-import tech.powerjob.common.model.DeployedContainerInfo;
-import tech.powerjob.common.model.GitRepoInfo;
-import tech.powerjob.common.request.ServerDeployContainerRequest;
-import tech.powerjob.common.request.ServerDestroyContainerRequest;
-import tech.powerjob.common.utils.CommonUtils;
-import tech.powerjob.common.serialize.JsonUtils;
-import tech.powerjob.common.utils.NetUtils;
-import tech.powerjob.common.utils.SegmentLock;
-import tech.powerjob.server.common.constants.ContainerSourceType;
-import tech.powerjob.server.common.constants.SwitchableStatus;
-import tech.powerjob.server.common.utils.OmsFileUtils;
-import tech.powerjob.server.extension.LockService;
-import tech.powerjob.server.persistence.remote.model.ContainerInfoDO;
-import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepository;
-import tech.powerjob.server.persistence.mongodb.GridFsManager;
-import tech.powerjob.server.remote.transport.TransportService;
-import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
-import tech.powerjob.server.common.module.WorkerInfo;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
@@ -28,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.maven.shared.invoker.DefaultInvocationRequest;
@@ -43,8 +24,29 @@ import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
+import tech.powerjob.common.OmsConstant;
+import tech.powerjob.common.model.DeployedContainerInfo;
+import tech.powerjob.common.model.GitRepoInfo;
+import tech.powerjob.common.request.ServerDeployContainerRequest;
+import tech.powerjob.common.request.ServerDestroyContainerRequest;
+import tech.powerjob.common.serialize.JsonUtils;
+import tech.powerjob.common.utils.CommonUtils;
+import tech.powerjob.common.utils.NetUtils;
+import tech.powerjob.common.utils.SegmentLock;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.server.common.constants.ContainerSourceType;
+import tech.powerjob.server.common.constants.SwitchableStatus;
+import tech.powerjob.server.common.module.WorkerInfo;
+import tech.powerjob.server.common.utils.OmsFileUtils;
+import tech.powerjob.server.extension.LockService;
+import tech.powerjob.server.persistence.mongodb.GridFsManager;
+import tech.powerjob.server.persistence.remote.model.ContainerInfoDO;
+import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepository;
+import tech.powerjob.server.remote.server.redirector.DesignateServer;
+import tech.powerjob.server.remote.tp.ServerURLFactory;
+import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import javax.annotation.Resource;
import javax.websocket.RemoteEndpoint;
@@ -128,7 +130,8 @@ public class ContainerService {
ServerDestroyContainerRequest destroyRequest = new ServerDestroyContainerRequest(container.getId());
workerClusterQueryService.getAllAliveWorkers(container.getAppId()).forEach(workerInfo -> {
- transportService.tell(Protocol.AKKA, workerInfo.getAddress(), destroyRequest);
+ final URL url = ServerURLFactory.destroyContainer2Worker(workerInfo.getAddress());
+ transportService.tell(workerInfo.getProtocol(), url, destroyRequest);
});
log.info("[ContainerService] delete container: {}.", container);
@@ -247,11 +250,8 @@ public class ContainerService {
containerInfoRepository.saveAndFlush(container);
// 开始部署(需要分批进行)
- Set workerAddressList = workerClusterQueryService.getAllAliveWorkers(container.getAppId())
- .stream()
- .map(WorkerInfo::getAddress)
- .collect(Collectors.toSet());
- if (workerAddressList.isEmpty()) {
+ final List allAliveWorkers = workerClusterQueryService.getAllAliveWorkers(container.getAppId());
+ if (allAliveWorkers.isEmpty()) {
remote.sendText("SYSTEM: there is no worker available now, deploy failed!");
return;
}
@@ -262,10 +262,12 @@ public class ContainerService {
long sleepTime = calculateSleepTime(jarFile.length());
AtomicInteger count = new AtomicInteger();
- workerAddressList.forEach(akkaAddress -> {
- transportService.tell(Protocol.AKKA, akkaAddress, req);
+ allAliveWorkers.forEach(workerInfo -> {
- remote.sendText("SYSTEM: send deploy request to " + akkaAddress);
+ final URL url = ServerURLFactory.deployContainer2Worker(workerInfo.getAddress());
+ transportService.tell(workerInfo.getProtocol(), url, req);
+
+ remote.sendText("SYSTEM: send deploy request to " + url.getAddress());
if (count.incrementAndGet() % DEPLOY_BATCH_NUM == 0) {
CommonUtils.executeIgnoreException(() -> Thread.sleep(sleepTime));
@@ -285,6 +287,7 @@ public class ContainerService {
* @param containerId 容器ID
* @return 拼接好的可阅读字符串
*/
+ @DesignateServer
public String fetchDeployedInfo(Long appId, Long containerId) {
List infoList = workerClusterQueryService.getDeployedContainerInfos(appId, containerId);
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
index 6fe30e70..a5231685 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
@@ -2,21 +2,27 @@ package tech.powerjob.server.core.handler;
import tech.powerjob.common.request.*;
import tech.powerjob.common.response.AskResponse;
+import tech.powerjob.remote.framework.actor.Handler;
+import tech.powerjob.remote.framework.actor.ProcessType;
+import tech.powerjob.server.remote.actoes.ServerActor;
import java.util.Optional;
+import static tech.powerjob.common.RemoteConstant.*;
+
/**
* 定义 server 与 worker 之间需要处理的协议
*
* @author tjq
* @since 2022/9/10
*/
-public interface IWorkerRequestHandler {
+public interface IWorkerRequestHandler extends ServerActor {
/**
* 处理 worker 上报的心跳信息
* @param heartbeat 心跳信息
*/
+ @Handler(path = S4W_HANDLER_WORKER_HEARTBEAT, processType = ProcessType.NO_BLOCKING)
void processWorkerHeartbeat(WorkerHeartbeat heartbeat);
/**
@@ -24,6 +30,7 @@ public interface IWorkerRequestHandler {
* @param req 上报请求
* @return 响应信息
*/
+ @Handler(path = S4W_HANDLER_REPORT_INSTANCE_STATUS, processType = ProcessType.BLOCKING)
Optional processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req);
/**
@@ -31,12 +38,14 @@ public interface IWorkerRequestHandler {
* @param req 请求
* @return cluster info
*/
+ @Handler(path = S4W_HANDLER_QUERY_JOB_CLUSTER, processType = ProcessType.BLOCKING)
AskResponse processWorkerQueryExecutorCluster(WorkerQueryExecutorClusterReq req);
/**
- * 处理 worker 日志推送请求
+ * 处理 worker 日志推送请求(内部使用线程池异步处理,非阻塞)
* @param req 请求
*/
+ @Handler(path = S4W_HANDLER_REPORT_LOG, processType = ProcessType.NO_BLOCKING)
void processWorkerLogReport(WorkerLogReportReq req);
/**
@@ -44,5 +53,6 @@ public interface IWorkerRequestHandler {
* @param request 请求
* @return 容器部署信息
*/
+ @Handler(path = S4W_HANDLER_WORKER_NEED_DEPLOY_CONTAINER, processType = ProcessType.BLOCKING)
AskResponse processWorkerNeedDeployContainer(WorkerNeedDeployContainerRequest request);
}
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java
index ed4e9206..13eef738 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java
@@ -4,11 +4,13 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
+import tech.powerjob.common.RemoteConstant;
import tech.powerjob.common.enums.InstanceStatus;
import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
import tech.powerjob.common.request.WorkerHeartbeat;
import tech.powerjob.common.request.WorkerLogReportReq;
import tech.powerjob.common.response.AskResponse;
+import tech.powerjob.remote.framework.actor.Actor;
import tech.powerjob.server.core.instance.InstanceLogService;
import tech.powerjob.server.core.instance.InstanceManager;
import tech.powerjob.server.core.workflow.WorkflowInstanceManager;
@@ -30,6 +32,7 @@ import java.util.Optional;
*/
@Slf4j
@Component
+@Actor(path = RemoteConstant.S4W_PATH)
public class WorkerRequestHandlerImpl extends AbWorkerRequestHandler {
private final InstanceManager instanceManager;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/Initializer.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/Initializer.java
deleted file mode 100644
index d34d7469..00000000
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/Initializer.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package tech.powerjob.server.core.handler.impl;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
-import org.springframework.stereotype.Component;
-import tech.powerjob.common.RemoteConstant;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
-import tech.powerjob.server.remote.transport.starter.VertXStarter;
-
-import javax.annotation.PostConstruct;
-
-/**
- * 初始化器
- *
- * @author tjq
- * @since 2022/9/11
- */
-@Component
-@ConditionalOnExpression("'${execution.env}'!='test'")
-public class Initializer {
-
- @PostConstruct
- public void initHandler() {
- // init akka
- AkkaStarter.actorSystem.actorOf(WorkerRequestAkkaHandler.defaultProps(), RemoteConstant.SERVER_ACTOR_NAME);
- // init vert.x
- VertXStarter.vertx.deployVerticle(new WorkerRequestHttpHandler());
- }
-}
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java
index 40f066e1..2c641c27 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java
@@ -2,15 +2,16 @@ package tech.powerjob.server.core.instance;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
-import org.apache.commons.lang3.StringUtils;
import tech.powerjob.common.enums.InstanceStatus;
import tech.powerjob.common.enums.Protocol;
import tech.powerjob.common.enums.TimeExpressionType;
import tech.powerjob.common.model.LifeCycle;
import tech.powerjob.common.request.ServerStopInstanceReq;
import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
+import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.common.module.WorkerInfo;
import tech.powerjob.server.common.timewheel.holder.HashedWheelTimerHolder;
import tech.powerjob.server.common.utils.SpringUtils;
@@ -22,10 +23,10 @@ import tech.powerjob.server.persistence.remote.model.InstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.model.UserInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
-import tech.powerjob.server.remote.transport.TransportService;
+import tech.powerjob.server.remote.tp.ServerURLFactory;
+import tech.powerjob.server.remote.tp.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
-import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@@ -176,7 +177,8 @@ public class InstanceManager {
if (workerInfoOpt.isPresent()) {
ServerStopInstanceReq stopInstanceReq = new ServerStopInstanceReq(instanceId);
WorkerInfo workerInfo = workerInfoOpt.get();
- transportService.tell(Protocol.of(workerInfo.getProtocol()), workerInfo.getAddress(), stopInstanceReq);
+ final URL url = ServerURLFactory.stopInstance2Worker(workerInfo.getAddress());
+ transportService.tell(workerInfo.getProtocol(), url, stopInstanceReq);
}
}
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java
index 2d465b96..db12ab99 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java
@@ -5,15 +5,16 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import tech.powerjob.common.PowerQuery;
+import tech.powerjob.common.RemoteConstant;
import tech.powerjob.common.SystemInstanceResult;
import tech.powerjob.common.enums.InstanceStatus;
-import tech.powerjob.common.enums.Protocol;
import tech.powerjob.common.exception.PowerJobException;
import tech.powerjob.common.model.InstanceDetail;
import tech.powerjob.common.request.ServerQueryInstanceStatusReq;
import tech.powerjob.common.request.ServerStopInstanceReq;
import tech.powerjob.common.response.AskResponse;
import tech.powerjob.common.response.InstanceInfoDTO;
+import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.common.constants.InstanceType;
import tech.powerjob.server.common.module.WorkerInfo;
import tech.powerjob.server.common.timewheel.TimerFuture;
@@ -26,12 +27,14 @@ import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
import tech.powerjob.server.persistence.remote.repository.JobInfoRepository;
import tech.powerjob.server.remote.server.redirector.DesignateServer;
-import tech.powerjob.server.remote.transport.TransportService;
+import tech.powerjob.server.remote.tp.ServerURLFactory;
+import tech.powerjob.server.remote.tp.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.Date;
import java.util.List;
import java.util.Optional;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static tech.powerjob.common.enums.InstanceStatus.RUNNING;
@@ -136,7 +139,7 @@ public class InstanceService {
if (workerInfoOpt.isPresent()) {
ServerStopInstanceReq req = new ServerStopInstanceReq(instanceId);
WorkerInfo workerInfo = workerInfoOpt.get();
- transportService.tell(Protocol.of(workerInfo.getProtocol()), workerInfo.getAddress(), req);
+ transportService.tell(workerInfo.getProtocol(), ServerURLFactory.stopInstance2Worker(workerInfo.getAddress()), req);
log.info("[Instance-{}] update instanceInfo and send 'stopInstance' request succeed.", instanceId);
} else {
log.warn("[Instance-{}] update instanceInfo successfully but can't find TaskTracker to stop instance", instanceId);
@@ -280,7 +283,10 @@ public class InstanceService {
WorkerInfo workerInfo = workerInfoOpt.get();
ServerQueryInstanceStatusReq req = new ServerQueryInstanceStatusReq(instanceId);
try {
- AskResponse askResponse = transportService.ask(Protocol.of(workerInfo.getProtocol()), workerInfo.getAddress(), req);
+ final URL url = ServerURLFactory.queryInstance2Worker(workerInfo.getAddress());
+ AskResponse askResponse = transportService.ask(workerInfo.getProtocol(), url, req, AskResponse.class)
+ .toCompletableFuture()
+ .get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (askResponse.isSuccess()) {
InstanceDetail instanceDetail = askResponse.getData(InstanceDetail.class);
instanceDetail.setRunningTimes(instanceInfoDO.getRunningTimes());
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java
index 879cd749..3d80692f 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java
@@ -22,9 +22,8 @@ import tech.powerjob.server.persistence.remote.model.WorkflowInfoDO;
import tech.powerjob.server.persistence.remote.model.WorkflowInstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.brief.BriefInstanceInfo;
import tech.powerjob.server.persistence.remote.repository.*;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
+import tech.powerjob.server.remote.tp.TransportService;
-import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@@ -49,6 +48,8 @@ public class InstanceStatusCheckService {
public static final long CHECK_INTERVAL = 10000;
+ private final TransportService transportService;
+
private final DispatchService dispatchService;
private final InstanceManager instanceManager;
@@ -61,7 +62,6 @@ public class InstanceStatusCheckService {
private final InstanceInfoRepository instanceInfoRepository;
-
private final WorkflowInfoRepository workflowInfoRepository;
private final WorkflowInstanceInfoRepository workflowInstanceInfoRepository;
@@ -69,7 +69,7 @@ public class InstanceStatusCheckService {
public void checkWorkflowInstance() {
Stopwatch stopwatch = Stopwatch.createStarted();
// 查询 DB 获取该 Server 需要负责的 AppGroup
- List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[InstanceStatusChecker] current server has no app's job to check");
return;
@@ -89,7 +89,7 @@ public class InstanceStatusCheckService {
public void checkWaitingDispatchInstance() {
Stopwatch stopwatch = Stopwatch.createStarted();
// 查询 DB 获取该 Server 需要负责的 AppGroup
- List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[InstanceStatusChecker] current server has no app's job to check");
return;
@@ -110,7 +110,7 @@ public class InstanceStatusCheckService {
public void checkWaitingWorkerReceiveInstance() {
Stopwatch stopwatch = Stopwatch.createStarted();
// 查询 DB 获取该 Server 需要负责的 AppGroup
- List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[InstanceStatusChecker] current server has no app's job to check");
return;
@@ -131,7 +131,7 @@ public class InstanceStatusCheckService {
public void checkRunningInstance() {
Stopwatch stopwatch = Stopwatch.createStarted();
// 查询 DB 获取该 Server 需要负责的 AppGroup
- List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[InstanceStatusChecker] current server has no app's job to check");
return;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java
index 33bf97f3..c63326ee 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java
@@ -23,10 +23,9 @@ import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
import tech.powerjob.server.persistence.remote.repository.JobInfoRepository;
import tech.powerjob.server.persistence.remote.repository.WorkflowInfoRepository;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
+import tech.powerjob.server.remote.tp.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterManagerService;
-import javax.annotation.Resource;
import java.util.*;
/**
@@ -47,6 +46,7 @@ public class PowerScheduleService {
*/
private static final int MAX_APP_NUM = 10;
+ private final TransportService transportService;
private final DispatchService dispatchService;
private final InstanceService instanceService;
@@ -72,7 +72,7 @@ public class PowerScheduleService {
long start = System.currentTimeMillis();
// 调度 CRON 表达式 JOB
try {
- final List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ final List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[CronJobSchedule] current server has no app's job to schedule.");
return;
@@ -92,7 +92,7 @@ public class PowerScheduleService {
long start = System.currentTimeMillis();
// 调度 CRON 表达式 WORKFLOW
try {
- final List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ final List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[CronWorkflowSchedule] current server has no app's workflow to schedule.");
return;
@@ -113,7 +113,7 @@ public class PowerScheduleService {
long start = System.currentTimeMillis();
// 调度 FIX_RATE/FIX_DELAY 表达式 JOB
try {
- final List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ final List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (CollectionUtils.isEmpty(allAppIds)) {
log.info("[FrequentJobSchedule] current server has no app's job to schedule.");
return;
@@ -132,7 +132,7 @@ public class PowerScheduleService {
public void cleanData() {
try {
- final List allAppIds = appInfoRepository.listAppIdByCurrentServer(AkkaStarter.getActorSystemAddress());
+ final List allAppIds = appInfoRepository.listAppIdByCurrentServer(transportService.defaultProtocol().getAddress());
if (allAppIds.isEmpty()) {
return;
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java
new file mode 100644
index 00000000..04f6fa60
--- /dev/null
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java
@@ -0,0 +1,10 @@
+package tech.powerjob.server.remote.actoes;
+
+/**
+ * ServerActor 声明接口
+ *
+ * @author tjq
+ * @since 2023/1/21
+ */
+public interface ServerActor {
+}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
new file mode 100644
index 00000000..5e3ceeb2
--- /dev/null
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
@@ -0,0 +1,52 @@
+package tech.powerjob.server.remote.server;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.stereotype.Component;
+import tech.powerjob.common.response.AskResponse;
+import tech.powerjob.common.serialize.JsonUtils;
+import tech.powerjob.remote.framework.actor.Handler;
+import tech.powerjob.remote.framework.actor.ProcessType;
+import tech.powerjob.server.remote.actoes.ServerActor;
+import tech.powerjob.server.remote.server.election.Ping;
+import tech.powerjob.server.remote.server.redirector.RemoteProcessReq;
+import tech.powerjob.server.remote.server.redirector.RemoteRequestProcessor;
+
+import static tech.powerjob.common.RemoteConstant.*;
+
+/**
+ * 处理朋友们的信息(处理服务器与服务器之间的通讯)
+ *
+ * @author tjq
+ * @since 2020/4/9
+ */
+@Slf4j
+@Component
+@Handler(path = S4S_PATH)
+public class FriendActor implements ServerActor {
+
+ private static final String SK = "dGVuZ2ppcWlAZ21haWwuY29tIA==";
+
+ /**
+ * 处理存活检测的请求
+ */
+ @Handler(path = S4S_HANDLER_PING, processType = ProcessType.NO_BLOCKING)
+ public AskResponse onReceivePing(Ping ping) {
+ return AskResponse.succeed(SK);
+ }
+
+ @Handler(path = S4S_HANDLER_PROCESS, processType = ProcessType.BLOCKING)
+ private AskResponse onReceiveRemoteProcessReq(RemoteProcessReq req) {
+
+ AskResponse response = new AskResponse();
+ response.setSuccess(true);
+ try {
+ response.setData(JsonUtils.toBytes(RemoteRequestProcessor.processRemoteRequest(req)));
+ } catch (Throwable t) {
+ log.error("[FriendActor] process remote request[{}] failed!", req, t);
+ response.setSuccess(false);
+ response.setMessage(ExceptionUtils.getMessage(t));
+ }
+ return response;
+ }
+}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendRequestHandler.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendRequestHandler.java
deleted file mode 100644
index edda488e..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendRequestHandler.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package tech.powerjob.server.remote.server;
-
-import akka.actor.AbstractActor;
-import akka.actor.Props;
-import akka.routing.DefaultResizer;
-import akka.routing.RoundRobinPool;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import tech.powerjob.common.response.AskResponse;
-import tech.powerjob.common.serialize.JsonUtils;
-import tech.powerjob.server.remote.server.election.Ping;
-import tech.powerjob.server.remote.server.redirector.RemoteProcessReq;
-import tech.powerjob.server.remote.server.redirector.RemoteRequestProcessor;
-import tech.powerjob.server.remote.transport.TransportService;
-
-/**
- * 处理朋友们的信息(处理服务器与服务器之间的通讯)
- *
- * @author tjq
- * @since 2020/4/9
- */
-@Slf4j
-public class FriendRequestHandler extends AbstractActor {
-
-
- public static Props defaultProps() {
- return Props.create(FriendRequestHandler.class)
- .withDispatcher("akka.friend-request-actor-dispatcher")
- .withRouter(
- new RoundRobinPool(Runtime.getRuntime().availableProcessors() * 4)
- .withResizer(new DefaultResizer(
- Runtime.getRuntime().availableProcessors() * 4,
- Runtime.getRuntime().availableProcessors() * 10,
- 1,
- 0.2d,
- 0.3d,
- 0.1d,
- 10
- ))
- );
- }
-
- @Override
- public Receive createReceive() {
- return receiveBuilder()
- .match(Ping.class, this::onReceivePing)
- .match(RemoteProcessReq.class, this::onReceiveRemoteProcessReq)
- .matchAny(obj -> log.warn("[FriendActor] receive unknown request: {}.", obj))
- .build();
- }
-
-
- @Override
- public void preStart() throws Exception {
- super.preStart();
- log.debug("[FriendRequestHandler]init FriendRequestActor");
- }
-
-
- @Override
- public void postStop() throws Exception {
- super.postStop();
- log.debug("[FriendRequestHandler]stop FriendRequestActor");
- }
-
- /**
- * 处理存活检测的请求
- */
- private void onReceivePing(Ping ping) {
- getSender().tell(AskResponse.succeed(TransportService.getAllAddress()), getSelf());
- }
-
- private void onReceiveRemoteProcessReq(RemoteProcessReq req) {
-
- AskResponse response = new AskResponse();
- response.setSuccess(true);
- try {
- response.setData(JsonUtils.toBytes(RemoteRequestProcessor.processRemoteRequest(req)));
- } catch (Throwable t) {
- log.error("[FriendActor] process remote request[{}] failed!", req, t);
- response.setSuccess(false);
- response.setMessage(ExceptionUtils.getMessage(t));
- }
- getSender().tell(response, getSelf());
- }
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
index 1db65201..e47599ba 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
@@ -1,29 +1,23 @@
package tech.powerjob.server.remote.server.election;
-import akka.actor.ActorSelection;
-import akka.pattern.Patterns;
-import com.alibaba.fastjson.JSONObject;
-import tech.powerjob.common.exception.PowerJobException;
-import tech.powerjob.common.enums.Protocol;
-import tech.powerjob.common.response.AskResponse;
-import tech.powerjob.common.serialize.JsonUtils;
-import tech.powerjob.server.extension.LockService;
-import tech.powerjob.server.persistence.remote.model.AppInfoDO;
-import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
-import tech.powerjob.server.remote.transport.TransportService;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import tech.powerjob.common.enums.Protocol;
+import tech.powerjob.common.exception.PowerJobException;
+import tech.powerjob.common.response.AskResponse;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.server.extension.LockService;
+import tech.powerjob.server.persistence.remote.model.AppInfoDO;
+import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
+import tech.powerjob.server.remote.tp.ServerURLFactory;
+import tech.powerjob.server.remote.tp.TransportService;
-import javax.annotation.Resource;
-import java.time.Duration;
import java.util.Date;
import java.util.Optional;
import java.util.Set;
-import java.util.concurrent.CompletionStage;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
@@ -59,7 +53,7 @@ public class ServerElectionService {
public String elect(Long appId, String protocol, String currentServer) {
if (!accurate()) {
// 如果是本机,就不需要查数据库那么复杂的操作了,直接返回成功
- if (getProtocolServerAddress(protocol).equals(currentServer)) {
+ if (transportService.defaultProtocol().getAddress().equals(currentServer)) {
return currentServer;
}
}
@@ -104,13 +98,14 @@ public class ServerElectionService {
}
// 篡位,本机作为Server
- // 注意,写入 AppInfoDO#currentServer 的永远是 ActorSystem 的地址,仅在返回的时候特殊处理
- appInfo.setCurrentServer(transportService.getTransporter(Protocol.AKKA).getAddress());
+ // 注意,写入 AppInfoDO#currentServer 的永远是 ActorSystem 的地址,仅在返回的时候特殊处理 (4.3.0 更改为 HTTP)
+ final String selfDefaultAddress = transportService.defaultProtocol().getAddress();
+ appInfo.setCurrentServer(selfDefaultAddress);
appInfo.setGmtModified(new Date());
appInfoRepository.saveAndFlush(appInfo);
log.info("[ServerElection] this server({}) become the new server for app(appId={}).", appInfo.getCurrentServer(), appId);
- return getProtocolServerAddress(protocol);
+ return selfDefaultAddress;
}catch (Exception e) {
log.error("[ServerElection] write new server to db failed for app {}.", appName, e);
}finally {
@@ -139,16 +134,18 @@ public class ServerElectionService {
Ping ping = new Ping();
ping.setCurrentTime(System.currentTimeMillis());
- ActorSelection serverActor = AkkaStarter.getFriendActor(serverAddress);
+ URL targetUrl = ServerURLFactory.ping2Friend(serverAddress);
try {
- CompletionStage askCS = Patterns.ask(serverActor, ping, Duration.ofMillis(PING_TIMEOUT_MS));
- AskResponse response = (AskResponse) askCS.toCompletableFuture().get(PING_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- downServerCache.remove(serverAddress);
+ AskResponse response = transportService.ask(Protocol.HTTP.name(), targetUrl, ping, AskResponse.class)
+ .toCompletableFuture()
+ .get(PING_TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (response.isSuccess()) {
- return JsonUtils.parseObject(response.getData(), JSONObject.class).getString(protocol);
+ log.info("[ServerElection] server[{}] is active, it will be the master.", serverAddress);
+ downServerCache.remove(serverAddress);
+ return serverAddress;
}
}catch (Exception e) {
- log.warn("[ServerElection] server({}) was down.", serverAddress);
+ log.warn("[ServerElection] server[{}] was down.", serverAddress);
}
downServerCache.add(serverAddress);
return null;
@@ -157,9 +154,4 @@ public class ServerElectionService {
private boolean accurate() {
return ThreadLocalRandom.current().nextInt(100) < accurateSelectServerPercentage;
}
-
- private String getProtocolServerAddress(String protocol) {
- Protocol pt = Protocol.of(protocol);
- return TransportService.getAllAddress().get(pt);
- }
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
index 9b5280b5..56eda4e4 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
@@ -1,17 +1,9 @@
package tech.powerjob.server.remote.server.redirector;
-import akka.pattern.Patterns;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import lombok.RequiredArgsConstructor;
-import tech.powerjob.common.exception.PowerJobException;
-import tech.powerjob.common.RemoteConstant;
-import tech.powerjob.common.response.AskResponse;
-import org.springframework.core.annotation.Order;
-import tech.powerjob.server.persistence.remote.model.AppInfoDO;
-import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -19,16 +11,25 @@ import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
+import tech.powerjob.common.RemoteConstant;
+import tech.powerjob.common.enums.Protocol;
+import tech.powerjob.common.exception.PowerJobException;
+import tech.powerjob.common.response.AskResponse;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.server.persistence.remote.model.AppInfoDO;
+import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
+import tech.powerjob.server.remote.tp.ServerURLFactory;
+import tech.powerjob.server.remote.tp.TransportService;
-import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import java.time.Duration;
import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.CompletionStage;
+import java.util.concurrent.TimeUnit;
/**
* 指定服务器运行切面
@@ -43,6 +44,7 @@ import java.util.concurrent.CompletionStage;
@RequiredArgsConstructor
public class DesignateServerAspect {
+ private final TransportService transportService;
private final AppInfoRepository appInfoRepository;
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -84,7 +86,7 @@ public class DesignateServerAspect {
}
// 目标IP与本地符合则本地执行
- if (Objects.equals(targetServer, AkkaStarter.getActorSystemAddress())) {
+ if (Objects.equals(targetServer, transportService.defaultProtocol())) {
return point.proceed();
}
@@ -96,8 +98,10 @@ public class DesignateServerAspect {
.setParameterTypes(parameterTypes)
.setArgs(args);
- CompletionStage askCS = Patterns.ask(AkkaStarter.getFriendActor(targetServer), remoteProcessReq, Duration.ofMillis(RemoteConstant.DEFAULT_TIMEOUT_MS));
- AskResponse askResponse = (AskResponse) askCS.toCompletableFuture().get();
+ final URL friendUrl = ServerURLFactory.process2Friend(targetServer);
+
+ CompletionStage askCS = transportService.ask(Protocol.HTTP.name(), friendUrl, remoteProcessReq, AskResponse.class);
+ AskResponse askResponse = askCS.toCompletableFuture().get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (!askResponse.isSuccess()) {
throw new PowerJobException("remote process failed: " + askResponse.getMessage());
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java
new file mode 100644
index 00000000..1b2f0e2e
--- /dev/null
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java
@@ -0,0 +1,169 @@
+package tech.powerjob.server.remote.tp;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import tech.powerjob.common.OmsConstant;
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.common.enums.Protocol;
+import tech.powerjob.common.utils.NetUtils;
+import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.base.RemotingException;
+import tech.powerjob.remote.framework.base.ServerType;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.remote.framework.engine.EngineConfig;
+import tech.powerjob.remote.framework.engine.EngineOutput;
+import tech.powerjob.remote.framework.engine.RemoteEngine;
+import tech.powerjob.remote.framework.engine.impl.PowerJobRemoteEngine;
+import tech.powerjob.server.remote.actoes.ServerActor;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletionStage;
+
+/**
+ * server 数据传输服务
+ *
+ * @author tjq
+ * @since 2023/1/21
+ */
+@Slf4j
+@Service
+public class PowerTransportService implements TransportService, InitializingBean {
+
+ @Value("${oms.transporter.active.protocols}")
+ private String activeProtocols;
+ private static final String PROTOCOL_PORT_CONFIG = "oms.%s.port";
+
+ private final Environment environment;
+ private final List serverActors;
+
+ private ProtocolInfo defaultProtocol;
+ private final Map protocol2Transporter = Maps.newHashMap();
+
+ public PowerTransportService(List serverActors, Environment environment) {
+ this.serverActors = serverActors;
+ this.environment = environment;
+ }
+
+ @Override
+ public ProtocolInfo defaultProtocol() {
+ return defaultProtocol;
+ }
+
+ private ProtocolInfo fetchProtocolInfo(String protocol) {
+ // 兼容老版 worker 未上报 protocol 的情况
+ protocol = compatibleProtocol(protocol);
+ final ProtocolInfo protocolInfo = protocol2Transporter.get(protocol);
+ if (protocolInfo == null) {
+ throw new IllegalArgumentException("can't find Transporter by protocol :" + protocol);
+ }
+ return protocolInfo;
+ }
+
+ @Override
+ public void tell(String protocol, URL url, PowerSerializable request) {
+ fetchProtocolInfo(protocol).getTransporter().tell(url, request);
+ }
+
+ @Override
+ public CompletionStage ask(String protocol, URL url, PowerSerializable request, Class clz) throws RemotingException {
+ return fetchProtocolInfo(protocol).getTransporter().ask(url, request, clz);
+ }
+
+ private void initRemoteFrameWork(String protocol, int port) {
+ Address address = new Address()
+ .setHost(NetUtils.getLocalHost())
+ .setPort(port);
+ EngineConfig engineConfig = new EngineConfig()
+ .setServerType(ServerType.SERVER)
+ .setType(protocol.toUpperCase())
+ .setBindAddress(address)
+ .setActorList(Lists.newArrayList(serverActors));
+ log.info("[PowerTransportService] start to initialize RemoteEngine[type={},address={}]", protocol, address);
+ RemoteEngine re = new PowerJobRemoteEngine();
+ final EngineOutput engineOutput = re.start(engineConfig);
+ log.info("[PowerTransportService] start RemoteEngine[type={},address={}] successfully", protocol, address);
+
+ this.protocol2Transporter.put(protocol, new ProtocolInfo(protocol, address.toFullAddress(), engineOutput.getTransporter()));
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+
+ log.info("[PowerTransportService] start to initialize whole PowerTransportService!");
+ log.info("[PowerTransportService] activeProtocols: {}", activeProtocols);
+
+ if (StringUtils.isEmpty(activeProtocols)) {
+ throw new IllegalArgumentException("activeProtocols can't be empty!");
+ }
+
+ for (String protocol : activeProtocols.split(OmsConstant.COMMA)) {
+ try {
+ final int port = parseProtocolPort(protocol);
+ initRemoteFrameWork(protocol, port);
+ } catch (Throwable t) {
+ log.error("[PowerTransportService] initialize protocol[{}] failed. If you don't need to use this protocol, you can turn it off by 'oms.transporter.active.protocols'", protocol);
+ ExceptionUtils.rethrow(t);
+ }
+ }
+
+ choseDefault();
+
+ log.info("[PowerTransportService] initialize successfully!");
+ log.info("[PowerTransportService] ALL_PROTOCOLS: {}", protocol2Transporter);
+ }
+
+ /**
+ * 获取协议端口,考虑兼容性 & 用户仔细扩展的场景,选择动态从 env 获取 port
+ * @return port
+ */
+ private int parseProtocolPort(String protocol) {
+ final String key1 = String.format(PROTOCOL_PORT_CONFIG, protocol.toLowerCase());
+ final String key2 = String.format(PROTOCOL_PORT_CONFIG, protocol.toUpperCase());
+ String portStr = environment.getProperty(key1);
+ if (StringUtils.isEmpty(portStr)) {
+ portStr = environment.getProperty(key2);
+ }
+ log.info("[PowerTransportService] fetch port for protocol[{}], key={}, value={}", protocol, key1, portStr);
+
+ if (StringUtils.isEmpty(portStr)) {
+ throw new IllegalArgumentException(String.format("can't find protocol config by key: %s, please check your spring config!", key1));
+ }
+
+ return Integer.parseInt(portStr);
+ }
+
+ private String compatibleProtocol(String p) {
+ if (p == null) {
+ return Protocol.AKKA.name();
+ }
+ return p;
+ }
+
+ /**
+ * HTTP 优先,否则默认取第一个协议
+ */
+ private void choseDefault() {
+ ProtocolInfo httpP = protocol2Transporter.get(Protocol.HTTP.name());
+ if (httpP != null) {
+ log.info("[PowerTransportService] exist HTTP protocol, chose this as the default protocol!");
+ this.defaultProtocol = httpP;
+ return;
+ }
+
+ String firstProtocol = activeProtocols.split(OmsConstant.COMMA)[0];
+ this.defaultProtocol = this.protocol2Transporter.get(firstProtocol);
+ log.info("[PowerTransportService] chose [{}] as the default protocol!", firstProtocol);
+
+ if (this.defaultProtocol == null) {
+ throw new IllegalArgumentException("can't find default protocol, please check your config!");
+ }
+ }
+}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java
new file mode 100644
index 00000000..c405d1b3
--- /dev/null
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java
@@ -0,0 +1,28 @@
+package tech.powerjob.server.remote.tp;
+
+import lombok.Getter;
+import lombok.ToString;
+import tech.powerjob.remote.framework.transporter.Transporter;
+
+/**
+ * ProtocolInfo
+ *
+ * @author tjq
+ * @since 2023/1/21
+ */
+@Getter
+@ToString
+public class ProtocolInfo {
+
+ private final String protocol;
+
+ private final String address;
+
+ private final transient Transporter transporter;
+
+ public ProtocolInfo(String protocol, String address, Transporter transporter) {
+ this.protocol = protocol;
+ this.address = address;
+ this.transporter = transporter;
+ }
+}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java
new file mode 100644
index 00000000..d8345ab0
--- /dev/null
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java
@@ -0,0 +1,52 @@
+package tech.powerjob.server.remote.tp;
+
+import tech.powerjob.remote.framework.base.Address;
+import tech.powerjob.remote.framework.base.HandlerLocation;
+import tech.powerjob.remote.framework.base.ServerType;
+import tech.powerjob.remote.framework.base.URL;
+
+import static tech.powerjob.common.RemoteConstant.*;
+
+/**
+ * 统一生成地址
+ *
+ * @author tjq
+ * @since 2023/1/21
+ */
+public class ServerURLFactory {
+
+ public static URL dispatchJob2Worker(String address) {
+ return simileBuild(address, ServerType.WORKER, WORKER_PATH, WTT_HANDLER_RUN_JOB);
+ }
+
+ public static URL stopInstance2Worker(String address) {
+ return simileBuild(address, ServerType.WORKER, WORKER_PATH, WTT_HANDLER_STOP_INSTANCE);
+ }
+
+ public static URL queryInstance2Worker(String address) {
+ return simileBuild(address, ServerType.WORKER, WORKER_PATH, WTT_HANDLER_QUERY_INSTANCE_STATUS);
+ }
+
+ public static URL deployContainer2Worker(String address) {
+ return simileBuild(address, ServerType.WORKER, WORKER_PATH, WORKER_HANDLER_DEPLOY_CONTAINER);
+ }
+
+ public static URL destroyContainer2Worker(String address) {
+ return simileBuild(address, ServerType.WORKER, WORKER_PATH, WORKER_HANDLER_DESTROY_CONTAINER);
+ }
+
+ public static URL ping2Friend(String address) {
+ return simileBuild(address, ServerType.SERVER, S4S_PATH, S4S_HANDLER_PING);
+ }
+
+ public static URL process2Friend(String address) {
+ return simileBuild(address, ServerType.SERVER, S4S_PATH, S4S_HANDLER_PROCESS);
+ }
+
+ public static URL simileBuild(String address, ServerType type, String rootPath, String handlerPath) {
+ return new URL()
+ .setServerType(type)
+ .setAddress(Address.fromIpv4(address))
+ .setLocation(new HandlerLocation().setRootPath(rootPath).setMethodPath(handlerPath));
+ }
+}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java
new file mode 100644
index 00000000..67473326
--- /dev/null
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java
@@ -0,0 +1,29 @@
+package tech.powerjob.server.remote.tp;
+
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.remote.framework.base.RemotingException;
+import tech.powerjob.remote.framework.base.URL;
+
+import java.util.concurrent.CompletionStage;
+
+/**
+ * server 数据传输服务
+ *
+ * @author tjq
+ * @since 2023/1/21
+ */
+public interface TransportService {
+
+ /**
+ * 自用地址,用于维护 server -> appId 和 server 间通讯
+ * 4.3.0 前为 ActorSystem Address(ip:10086)
+ * 4.3.0 后 PowerJob 将主协议切换为 HTTP,使用 HTTP address (ip:10010)
+ * @return 自用地址
+ */
+ ProtocolInfo defaultProtocol();
+
+ void tell(String protocol, URL url, PowerSerializable request);
+
+ CompletionStage ask(String protocol, URL url, PowerSerializable request, Class clz) throws RemotingException;
+
+}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/TransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/TransportService.java
deleted file mode 100644
index 3ee154d5..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/TransportService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package tech.powerjob.server.remote.transport;
-
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.enums.Protocol;
-import tech.powerjob.common.response.AskResponse;
-import com.google.common.collect.Maps;
-import lombok.Getter;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * TransportService
- *
- * @author tjq
- * @since 2021/2/7
- */
-@Slf4j
-@Service
-public class TransportService {
-
- private static final Map protocol2Address = Maps.newHashMap();
-
- @Getter
- private final Map protocol2Transporter = Maps.newConcurrentMap();
-
- @Autowired
- public TransportService(List transporters) {
- transporters.forEach(t -> {
- log.info("[TransportService] Transporter[protocol:{},address:{}] registration successful!", t.getProtocol(), t.getAddress());
- protocol2Transporter.put(t.getProtocol(), t);
- protocol2Address.put(t.getProtocol(), t.getAddress());
- });
- }
-
- public void tell(Protocol protocol, String address, PowerSerializable object) {
- getTransporter(protocol).tell(address, object);
- }
-
- public AskResponse ask(Protocol protocol, String address, PowerSerializable object) throws Exception {
-
- return getTransporter(protocol).ask(address, object);
- }
-
- public Transporter getTransporter(Protocol protocol) {
- Transporter transporter = protocol2Transporter.get(protocol);
- if (transporter == null) {
- log.error("[TransportService] can't find transporter by protocol[{}], this is a bug!", protocol);
- throw new UnknownProtocolException("can't find transporter by protocol: " + protocol);
- }
- return transporter;
- }
-
- public static class UnknownProtocolException extends RuntimeException {
- public UnknownProtocolException(String message) {
- super(message);
- }
- }
-
- public static Map getAllAddress() {
- return protocol2Address;
- }
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/Transporter.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/Transporter.java
deleted file mode 100644
index 6d77dd69..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/Transporter.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package tech.powerjob.server.remote.transport;
-
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.enums.Protocol;
-import tech.powerjob.common.response.AskResponse;
-
-/**
- * Transporter
- *
- * @author tjq
- * @since 2021/2/7
- */
-public interface Transporter {
-
- Protocol getProtocol();
-
- String getAddress();
-
- void tell(String address, PowerSerializable object);
-
- AskResponse ask(String address, PowerSerializable object) throws Exception;
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/AkkaTransporter.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/AkkaTransporter.java
deleted file mode 100644
index 3a7ae9a1..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/AkkaTransporter.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package tech.powerjob.server.remote.transport.impl;
-
-import akka.actor.ActorSelection;
-import akka.pattern.Patterns;
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.enums.Protocol;
-import tech.powerjob.common.RemoteConstant;
-import tech.powerjob.common.response.AskResponse;
-import tech.powerjob.server.remote.transport.Transporter;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
-import org.springframework.stereotype.Service;
-
-import java.time.Duration;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.TimeUnit;
-
-/**
- * akka transporter
- *
- * @author tjq
- * @since 2021/2/7
- */
-@Service
-public class AkkaTransporter implements Transporter {
-
- @Override
- public Protocol getProtocol() {
- return Protocol.AKKA;
- }
-
- @Override
- public String getAddress() {
- return AkkaStarter.getActorSystemAddress();
- }
-
- @Override
- public void tell(String address, PowerSerializable object) {
- ActorSelection taskTrackerActor = AkkaStarter.getWorkerActor(address);
- taskTrackerActor.tell(object, null);
- }
-
- @Override
- public AskResponse ask(String address, PowerSerializable object) throws Exception {
- ActorSelection taskTrackerActor = AkkaStarter.getWorkerActor(address);
- CompletionStage askCS = Patterns.ask(taskTrackerActor, object, Duration.ofMillis(RemoteConstant.DEFAULT_TIMEOUT_MS));
- return (AskResponse) askCS.toCompletableFuture().get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- }
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/HttpTransporter.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/HttpTransporter.java
deleted file mode 100644
index 365b60a5..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/impl/HttpTransporter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package tech.powerjob.server.remote.transport.impl;
-
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.enums.Protocol;
-import tech.powerjob.common.RemoteConstant;
-import tech.powerjob.common.response.AskResponse;
-import tech.powerjob.common.utils.NetUtils;
-import tech.powerjob.server.remote.transport.Transporter;
-import tech.powerjob.server.remote.transport.starter.VertXStarter;
-import io.vertx.core.Future;
-import io.vertx.core.Vertx;
-import io.vertx.core.buffer.Buffer;
-import io.vertx.ext.web.client.HttpResponse;
-import io.vertx.ext.web.client.WebClient;
-import io.vertx.ext.web.client.WebClientOptions;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.tuple.Pair;
-import org.springframework.stereotype.Service;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-
-/**
- * http transporter powered by vert.x
- *
- * @author tjq
- * @since 2021/2/8
- */
-@Slf4j
-@Service
-public class HttpTransporter implements Transporter {
-
- private final WebClient webClient;
-
- public HttpTransporter() {
- WebClientOptions options = new WebClientOptions()
- .setKeepAlive(false)
- .setConnectTimeout((int) RemoteConstant.DEFAULT_TIMEOUT_MS);
- webClient = WebClient.create(Vertx.vertx(), options);
- }
-
- @Override
- public Protocol getProtocol() {
- return Protocol.HTTP;
- }
-
- @Override
- public String getAddress() {
- return VertXStarter.getAddress();
- }
-
- @Override
- public void tell(String address, PowerSerializable object) {
- postRequest(address, object);
- }
-
- @Override
- public AskResponse ask(String address, PowerSerializable object) throws Exception {
- CompletableFuture> future = postRequest(address, object).toCompletionStage().toCompletableFuture();
- HttpResponse httpResponse = future.get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- return httpResponse.bodyAsJson(AskResponse.class);
- }
-
- private Future> postRequest(String address, PowerSerializable object) {
- Pair ipAndPort = NetUtils.splitAddress2IpAndPort(address);
- String ip = ipAndPort.getLeft();
- int port = ipAndPort.getRight();
- return webClient.post(port, ip, object.path())
- .sendJson(object)
- .onSuccess(res -> log.info("[HttpTransporter] send request to {}{} successfully: {}, response: {}", address, object.path(), object, res))
- .onFailure(t -> log.warn("[HttpTransporter] send request to {}{} failed: {}", address, object.path(), object, t));
- }
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/AkkaStarter.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/AkkaStarter.java
deleted file mode 100644
index de54e273..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/AkkaStarter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package tech.powerjob.server.remote.transport.starter;
-
-import akka.actor.ActorSelection;
-import akka.actor.ActorSystem;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.Maps;
-import com.typesafe.config.Config;
-import com.typesafe.config.ConfigFactory;
-import lombok.Getter;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import tech.powerjob.common.OmsConstant;
-import tech.powerjob.common.RemoteConstant;
-import tech.powerjob.common.utils.NetUtils;
-import tech.powerjob.server.common.PowerJobServerConfigKey;
-import tech.powerjob.server.common.utils.PropertyUtils;
-import tech.powerjob.server.remote.server.FriendRequestHandler;
-
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * 服务端 ActorSystem 启动器
- *
- * @author tjq
- * @since 2020/4/2
- */
-@Slf4j
-public class AkkaStarter {
-
- public static ActorSystem actorSystem;
- @Getter
- private static String actorSystemAddress;
-
- private static final String AKKA_PATH = "akka://%s@%s/user/%s";
-
- public static void init() {
-
- Stopwatch stopwatch = Stopwatch.createStarted();
- log.info("[PowerJob] PowerJob's akka system start to bootstrap...");
-
- // 忽略了一个问题,机器是没办法访问外网的,除非架设自己的NTP服务器
- // TimeUtils.check();
-
- // 解析配置文件
- Config akkaFinalConfig = parseConfig();
- actorSystem = ActorSystem.create(RemoteConstant.SERVER_ACTOR_SYSTEM_NAME, akkaFinalConfig);
- actorSystem.actorOf(FriendRequestHandler.defaultProps(), RemoteConstant.SERVER_FRIEND_ACTOR_NAME);
- log.info("[PowerJob] PowerJob's akka system started successfully, using time {}.", stopwatch);
- }
-
- private static Config parseConfig() {
- Properties properties = PropertyUtils.getProperties();
- int port = Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.AKKA_PORT, String.valueOf(OmsConstant.SERVER_DEFAULT_AKKA_PORT)));
- String portFromJvm = System.getProperty(PowerJobServerConfigKey.AKKA_PORT);
- if (StringUtils.isNotEmpty(portFromJvm)) {
- log.info("[PowerJob] use port from jvm params: {}", portFromJvm);
- port = Integer.parseInt(portFromJvm);
- }
-
- // 启动 ActorSystem
- Map overrideConfig = Maps.newHashMap();
- String localIp = NetUtils.getLocalHost();
- overrideConfig.put("akka.remote.artery.canonical.hostname", localIp);
- overrideConfig.put("akka.remote.artery.canonical.port", port);
- actorSystemAddress = localIp + ":" + port;
- log.info("[PowerJob] akka-remote server address: {}", actorSystemAddress);
-
- Config akkaBasicConfig = ConfigFactory.load(RemoteConstant.SERVER_AKKA_CONFIG_NAME);
- return ConfigFactory.parseMap(overrideConfig).withFallback(akkaBasicConfig);
- }
-
- /**
- * 获取 ServerActor 的 ActorSelection
- *
- * @param address IP:port
- * @return ActorSelection
- */
- public static ActorSelection getFriendActor(String address) {
- String path = String.format(AKKA_PATH, RemoteConstant.SERVER_ACTOR_SYSTEM_NAME, address, RemoteConstant.SERVER_FRIEND_ACTOR_NAME);
- return actorSystem.actorSelection(path);
- }
-
- public static ActorSelection getWorkerActor(String address) {
- String path = String.format(AKKA_PATH, RemoteConstant.WORKER_ACTOR_SYSTEM_NAME, address, RemoteConstant.WORKER_ACTOR_NAME);
- return actorSystem.actorSelection(path);
- }
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/VertXStarter.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/VertXStarter.java
deleted file mode 100644
index 5f419c26..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transport/starter/VertXStarter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package tech.powerjob.server.remote.transport.starter;
-
-import tech.powerjob.common.OmsConstant;
-import tech.powerjob.common.utils.NetUtils;
-import tech.powerjob.server.common.PowerJobServerConfigKey;
-import tech.powerjob.server.common.utils.PropertyUtils;
-import com.google.common.base.Stopwatch;
-import io.vertx.core.Vertx;
-import lombok.Getter;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Properties;
-
-/**
- * vert.x starter
- *
- * @author tjq
- * @since 2021/2/8
- */
-@Slf4j
-public class VertXStarter {
-
- public static Vertx vertx;
- @Getter
- private static String address;
-
- public static void init() {
- Stopwatch stopwatch = Stopwatch.createStarted();
- log.info("[PowerJob] PowerJob's vert.x system start to bootstrap...");
-
- Properties properties = PropertyUtils.getProperties();
- int port = Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.HTTP_PORT, String.valueOf(OmsConstant.SERVER_DEFAULT_HTTP_PORT)));
- String portFromJVM = System.getProperty(PowerJobServerConfigKey.HTTP_PORT);
- if (StringUtils.isNotEmpty(portFromJVM)) {
- port = Integer.parseInt(portFromJVM);
- }
- String localIP = NetUtils.getLocalHost();
-
- address = localIP + ":" + port;
- log.info("[PowerJob] vert.x server address: {}", address);
-
- vertx = Vertx.vertx();
-
- log.info("[PowerJob] PowerJob's vert.x system started successfully, using time {}.", stopwatch);
- }
-}
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/PowerJobServerApplication.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/PowerJobServerApplication.java
index 22a660af..75af8667 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/PowerJobServerApplication.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/PowerJobServerApplication.java
@@ -1,8 +1,6 @@
package tech.powerjob.server;
import tech.powerjob.server.common.utils.PropertyUtils;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
-import tech.powerjob.server.remote.transport.starter.VertXStarter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -30,9 +28,6 @@ public class PowerJobServerApplication {
pre();
- AkkaStarter.init();
- VertXStarter.init();
-
// Start SpringBoot application.
try {
SpringApplication.run(PowerJobServerApplication.class, args);
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java
index 8f13e0ef..4b1aca3e 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java
@@ -1,20 +1,5 @@
package tech.powerjob.server.web.controller;
-import tech.powerjob.common.OmsConstant;
-import tech.powerjob.common.response.ResultDTO;
-import tech.powerjob.server.remote.transport.starter.AkkaStarter;
-import tech.powerjob.server.common.constants.ContainerSourceType;
-import tech.powerjob.server.common.constants.SwitchableStatus;
-import tech.powerjob.server.core.container.ContainerTemplateGenerator;
-import tech.powerjob.server.common.utils.OmsFileUtils;
-import tech.powerjob.server.persistence.remote.model.AppInfoDO;
-import tech.powerjob.server.persistence.remote.model.ContainerInfoDO;
-import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
-import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepository;
-import tech.powerjob.server.core.container.ContainerService;
-import tech.powerjob.server.web.request.GenerateContainerTemplateRequest;
-import tech.powerjob.server.web.request.SaveContainerInfoRequest;
-import tech.powerjob.server.web.response.ContainerInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
@@ -22,8 +7,21 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
+import tech.powerjob.common.OmsConstant;
+import tech.powerjob.common.response.ResultDTO;
+import tech.powerjob.server.common.constants.ContainerSourceType;
+import tech.powerjob.server.common.constants.SwitchableStatus;
+import tech.powerjob.server.common.utils.OmsFileUtils;
+import tech.powerjob.server.core.container.ContainerService;
+import tech.powerjob.server.core.container.ContainerTemplateGenerator;
+import tech.powerjob.server.persistence.remote.model.AppInfoDO;
+import tech.powerjob.server.persistence.remote.model.ContainerInfoDO;
+import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
+import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepository;
+import tech.powerjob.server.web.request.GenerateContainerTemplateRequest;
+import tech.powerjob.server.web.request.SaveContainerInfoRequest;
+import tech.powerjob.server.web.response.ContainerInfoVO;
-import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
@@ -114,17 +112,6 @@ public class ContainerController {
return ResultDTO.failed("No workers have even registered!");
}
- // 转发 HTTP 请求
- if (!AkkaStarter.getActorSystemAddress().equals(targetServer)) {
- String targetIp = targetServer.split(":")[0];
- String url = String.format("http://%s:%d/container/listDeployedWorker?appId=%d&containerId=%d", targetIp, port, appId, containerId);
- try {
- response.sendRedirect(url);
- return ResultDTO.success(null);
- }catch (Exception e) {
- return ResultDTO.failed(e);
- }
- }
return ResultDTO.success(containerService.fetchDeployedInfo(appId, containerId));
}
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
index ada346e3..aa844214 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
@@ -13,7 +13,7 @@ import tech.powerjob.common.utils.NetUtils;
import tech.powerjob.server.persistence.remote.model.AppInfoDO;
import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
import tech.powerjob.server.remote.server.election.ServerElectionService;
-import tech.powerjob.server.remote.transport.TransportService;
+import tech.powerjob.server.remote.tp.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.Optional;
@@ -55,7 +55,7 @@ public class ServerController {
public ResultDTO ping(@RequestParam(required = false) boolean debug) {
JSONObject res = new JSONObject();
res.put("localHost", NetUtils.getLocalHost());
- res.put("communicationSystemInfo", transportService.getProtocol2Transporter());
+ res.put("defaultAddress", transportService.defaultProtocol());
res.put("serverTime", CommonUtils.formatTime(System.currentTimeMillis()));
res.put("serverTimeZone", TimeZone.getDefault().getDisplayName());
res.put("appIds", workerClusterQueryService.getAppId2ClusterStatus().keySet());
diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/application.properties b/powerjob-server/powerjob-server-starter/src/main/resources/application.properties
index 9f65c568..72fd1ec8 100644
--- a/powerjob-server/powerjob-server-starter/src/main/resources/application.properties
+++ b/powerjob-server/powerjob-server-starter/src/main/resources/application.properties
@@ -18,6 +18,7 @@ spring.main.allow-circular-references=true
###### PowerJob self-owned configuration (The following properties should exist in application.properties only). ######
# Akka ActorSystem port.
+oms.transporter.active.protocols=AKKA,HTTP
oms.akka.port=10086
oms.http.port=10010
# Prefix for all tables. Default empty string. Config if you have needs, i.e. pj_
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/TransportUtils.java b/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/TransportUtils.java
index ac2f185f..3a7f1127 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/TransportUtils.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/TransportUtils.java
@@ -30,7 +30,7 @@ import static tech.powerjob.common.RemoteConstant.*;
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);
+ final URL url = easyBuildUrl(ServerType.SERVER, S4W_PATH, S4W_HANDLER_REPORT_INSTANCE_STATUS, address);
transporter.tell(url, req);
}
@@ -55,12 +55,12 @@ public class TransportUtils {
}
public static void reportLogs(WorkerLogReportReq req, String address, Transporter transporter) {
- final URL url = easyBuildUrl(ServerType.SERVER, SERVER_PATH, SERVER_HANDLER_REPORT_LOG, address);
+ final URL url = easyBuildUrl(ServerType.SERVER, S4W_PATH, S4W_HANDLER_REPORT_LOG, address);
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);
+ final URL url = easyBuildUrl(ServerType.SERVER, S4W_PATH, S4W_HANDLER_WORKER_HEARTBEAT, address);
transporter.tell(url, req);
}
@@ -83,17 +83,17 @@ public class TransportUtils {
@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();
+ return reliableAsk(ServerType.SERVER, S4W_PATH, S4W_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);
+ return reliableAsk(ServerType.SERVER, S4W_PATH, S4W_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);
+ return reliableAsk(ServerType.SERVER, S4W_PATH, S4W_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 {
From dedefd5a6daef32295a5c79fb61663fe3e63a1e0 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 10:31:12 +0800
Subject: [PATCH 060/100] feat: replace akka by PowerJobRemoteEngine in server
side
---
.../main/java/tech/powerjob/server/core/DispatchService.java | 4 ++--
.../powerjob/server/core/container/ContainerService.java | 4 ++--
.../tech/powerjob/server/core/instance/InstanceManager.java | 5 ++---
.../tech/powerjob/server/core/instance/InstanceService.java | 4 ++--
.../server/core/scheduler/InstanceStatusCheckService.java | 2 +-
.../powerjob/server/core/scheduler/PowerScheduleService.java | 2 +-
.../server/remote/server/election/ServerElectionService.java | 4 ++--
.../remote/server/redirector/DesignateServerAspect.java | 4 ++--
.../server/remote/{tp => transporter}/ProtocolInfo.java | 2 +-
.../server/remote/{tp => transporter}/TransportService.java | 4 ++--
.../{tp => transporter/impl}/PowerTransportService.java | 4 +++-
.../remote/{tp => transporter/impl}/ServerURLFactory.java | 2 +-
.../powerjob/server/web/controller/ServerController.java | 2 +-
13 files changed, 22 insertions(+), 21 deletions(-)
rename powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/{tp => transporter}/ProtocolInfo.java (91%)
rename powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/{tp => transporter}/TransportService.java (82%)
rename powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/{tp => transporter/impl}/PowerTransportService.java (97%)
rename powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/{tp => transporter/impl}/ServerURLFactory.java (97%)
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
index 29f10c7b..3e9eb97e 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
@@ -20,8 +20,8 @@ import tech.powerjob.server.core.lock.UseCacheLock;
import tech.powerjob.server.persistence.remote.model.InstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
-import tech.powerjob.server.remote.tp.ServerURLFactory;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
+import tech.powerjob.server.remote.transporter.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.ArrayList;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
index 89875876..5af8d0b3 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
@@ -44,8 +44,8 @@ import tech.powerjob.server.persistence.mongodb.GridFsManager;
import tech.powerjob.server.persistence.remote.model.ContainerInfoDO;
import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepository;
import tech.powerjob.server.remote.server.redirector.DesignateServer;
-import tech.powerjob.server.remote.tp.ServerURLFactory;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
+import tech.powerjob.server.remote.transporter.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import javax.annotation.Resource;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java
index 2c641c27..ee810483 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceManager.java
@@ -6,7 +6,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import tech.powerjob.common.enums.InstanceStatus;
-import tech.powerjob.common.enums.Protocol;
import tech.powerjob.common.enums.TimeExpressionType;
import tech.powerjob.common.model.LifeCycle;
import tech.powerjob.common.request.ServerStopInstanceReq;
@@ -23,8 +22,8 @@ import tech.powerjob.server.persistence.remote.model.InstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.model.UserInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
-import tech.powerjob.server.remote.tp.ServerURLFactory;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
+import tech.powerjob.server.remote.transporter.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.Date;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java
index db12ab99..53071a6d 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java
@@ -27,8 +27,8 @@ import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
import tech.powerjob.server.persistence.remote.repository.JobInfoRepository;
import tech.powerjob.server.remote.server.redirector.DesignateServer;
-import tech.powerjob.server.remote.tp.ServerURLFactory;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
+import tech.powerjob.server.remote.transporter.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.Date;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java
index 3d80692f..4652904f 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/InstanceStatusCheckService.java
@@ -22,7 +22,7 @@ import tech.powerjob.server.persistence.remote.model.WorkflowInfoDO;
import tech.powerjob.server.persistence.remote.model.WorkflowInstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.brief.BriefInstanceInfo;
import tech.powerjob.server.persistence.remote.repository.*;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.TransportService;
import java.util.*;
import java.util.stream.Collectors;
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java
index c63326ee..5f65fa07 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/scheduler/PowerScheduleService.java
@@ -23,7 +23,7 @@ import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
import tech.powerjob.server.persistence.remote.repository.JobInfoRepository;
import tech.powerjob.server.persistence.remote.repository.WorkflowInfoRepository;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterManagerService;
import java.util.*;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
index e47599ba..b3871159 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
@@ -12,8 +12,8 @@ import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.extension.LockService;
import tech.powerjob.server.persistence.remote.model.AppInfoDO;
import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
-import tech.powerjob.server.remote.tp.ServerURLFactory;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
+import tech.powerjob.server.remote.transporter.TransportService;
import java.util.Date;
import java.util.Optional;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
index 56eda4e4..1f178dde 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
@@ -20,8 +20,8 @@ import tech.powerjob.common.response.AskResponse;
import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.persistence.remote.model.AppInfoDO;
import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
-import tech.powerjob.server.remote.tp.ServerURLFactory;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
+import tech.powerjob.server.remote.transporter.TransportService;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java
similarity index 91%
rename from powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java
rename to powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java
index c405d1b3..e620d2df 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ProtocolInfo.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java
@@ -1,4 +1,4 @@
-package tech.powerjob.server.remote.tp;
+package tech.powerjob.server.remote.transporter;
import lombok.Getter;
import lombok.ToString;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java
similarity index 82%
rename from powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java
rename to powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java
index 67473326..3124aa27 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/TransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java
@@ -1,4 +1,4 @@
-package tech.powerjob.server.remote.tp;
+package tech.powerjob.server.remote.transporter;
import tech.powerjob.common.PowerSerializable;
import tech.powerjob.remote.framework.base.RemotingException;
@@ -17,7 +17,7 @@ public interface TransportService {
/**
* 自用地址,用于维护 server -> appId 和 server 间通讯
* 4.3.0 前为 ActorSystem Address(ip:10086)
- * 4.3.0 后 PowerJob 将主协议切换为 HTTP,使用 HTTP address (ip:10010)
+ * 4.3.0 后 PowerJob 将主协议切换为自由协议,默认使用 HTTP address (ip:10010)
* @return 自用地址
*/
ProtocolInfo defaultProtocol();
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
similarity index 97%
rename from powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java
rename to powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
index 1b2f0e2e..8654f76d 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/PowerTransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
@@ -1,4 +1,4 @@
-package tech.powerjob.server.remote.tp;
+package tech.powerjob.server.remote.transporter.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -22,6 +22,8 @@ import tech.powerjob.remote.framework.engine.EngineOutput;
import tech.powerjob.remote.framework.engine.RemoteEngine;
import tech.powerjob.remote.framework.engine.impl.PowerJobRemoteEngine;
import tech.powerjob.server.remote.actoes.ServerActor;
+import tech.powerjob.server.remote.transporter.ProtocolInfo;
+import tech.powerjob.server.remote.transporter.TransportService;
import java.util.List;
import java.util.Map;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/ServerURLFactory.java
similarity index 97%
rename from powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java
rename to powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/ServerURLFactory.java
index d8345ab0..0edc3c65 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/tp/ServerURLFactory.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/ServerURLFactory.java
@@ -1,4 +1,4 @@
-package tech.powerjob.server.remote.tp;
+package tech.powerjob.server.remote.transporter.impl;
import tech.powerjob.remote.framework.base.Address;
import tech.powerjob.remote.framework.base.HandlerLocation;
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
index aa844214..1565cdb0 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
@@ -13,7 +13,7 @@ import tech.powerjob.common.utils.NetUtils;
import tech.powerjob.server.persistence.remote.model.AppInfoDO;
import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
import tech.powerjob.server.remote.server.election.ServerElectionService;
-import tech.powerjob.server.remote.tp.TransportService;
+import tech.powerjob.server.remote.transporter.TransportService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.Optional;
From e74fc2d1387ba0db25a9744b33e813011e7a7c62 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 10:34:37 +0800
Subject: [PATCH 061/100] chore: remove akka in common package
---
powerjob-common/pom.xml | 13 ---
powerjob-server/pom.xml | 12 ---
.../handler/WorkerRequestHandlerHolder.java | 27 -----
.../impl/WorkerRequestAkkaHandler.java | 100 ------------------
.../impl/WorkerRequestHttpHandler.java | 81 --------------
5 files changed, 233 deletions(-)
delete mode 100644 powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerHolder.java
delete mode 100644 powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestAkkaHandler.java
delete mode 100644 powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestHttpHandler.java
diff --git a/powerjob-common/pom.xml b/powerjob-common/pom.xml
index dcd8d499..41387b46 100644
--- a/powerjob-common/pom.xml
+++ b/powerjob-common/pom.xml
@@ -19,7 +19,6 @@
2.11.0
31.1-jre
3.14.9
- 2.6.20
5.3.0
2.14.0-rc1
5.9.0
@@ -54,18 +53,6 @@
${okhttp.version}
-
-
- com.typesafe.akka
- akka-remote_2.13
- ${akka.version}
-
-
- com.typesafe.akka
- akka-slf4j_2.13
- ${akka.version}
-
-
commons-io
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index dedfefba..b9cc9460 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -43,7 +43,6 @@
3.8.0
1.2.83
1.0.1
- 4.0.2
true
@@ -252,17 +251,6 @@
-
- io.vertx
- vertx-web
- ${vertx-web.version}
-
-
- io.vertx
- vertx-web-client
- ${vertx-web.version}
-
-
com.cronutils
cron-utils
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerHolder.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerHolder.java
deleted file mode 100644
index f9c267cc..00000000
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerHolder.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package tech.powerjob.server.core.handler;
-
-import org.springframework.stereotype.Component;
-
-
-/**
- * WorkerRequestHandlerHolder
- *
- * @author tjq
- * @since 2022/9/11
- */
-@Component
-public class WorkerRequestHandlerHolder {
-
- private static IWorkerRequestHandler workerRequestHandler;
-
- public WorkerRequestHandlerHolder(IWorkerRequestHandler injectedWorkerRequestHandler) {
- workerRequestHandler = injectedWorkerRequestHandler;
- }
-
- public static IWorkerRequestHandler fetchWorkerRequestHandler() {
- if (workerRequestHandler == null){
- throw new IllegalStateException("WorkerRequestHandlerHolder not initialized!");
- }
- return workerRequestHandler;
- }
-}
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestAkkaHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestAkkaHandler.java
deleted file mode 100644
index 26f18be0..00000000
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestAkkaHandler.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package tech.powerjob.server.core.handler.impl;
-
-import akka.actor.AbstractActor;
-import akka.actor.Props;
-import akka.routing.DefaultResizer;
-import akka.routing.RoundRobinPool;
-import tech.powerjob.common.request.*;
-import tech.powerjob.common.response.AskResponse;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Optional;
-
-import static tech.powerjob.server.core.handler.WorkerRequestHandlerHolder.fetchWorkerRequestHandler;
-
-/**
- * 处理 Worker 请求
- *
- * @author tjq
- * @since 2020/3/30
- */
-@Slf4j
-public class WorkerRequestAkkaHandler extends AbstractActor {
-
-
- public static Props defaultProps(){
- return Props.create(WorkerRequestAkkaHandler.class)
- .withDispatcher("akka.w-r-c-d")
- .withRouter(
- new RoundRobinPool(Runtime.getRuntime().availableProcessors() * 4)
- .withResizer(new DefaultResizer(
- Runtime.getRuntime().availableProcessors() * 4,
- Runtime.getRuntime().availableProcessors() * 10,
- 1,
- 0.2d,
- 0.3d,
- 0.1d,
- 10
- ))
- );
- }
-
- @Override
- public Receive createReceive() {
- return receiveBuilder()
- .match(WorkerHeartbeat.class, hb -> fetchWorkerRequestHandler().processWorkerHeartbeat(hb))
- .match(TaskTrackerReportInstanceStatusReq.class, this::onReceiveTaskTrackerReportInstanceStatusReq)
- .match(WorkerLogReportReq.class, req -> fetchWorkerRequestHandler().processWorkerLogReport(req))
- .match(WorkerNeedDeployContainerRequest.class, this::onReceiveWorkerNeedDeployContainerRequest)
- .match(WorkerQueryExecutorClusterReq.class, this::onReceiveWorkerQueryExecutorClusterReq)
- .matchAny(obj -> log.warn("[WorkerRequestAkkaHandler] receive unknown request: {}.", obj))
- .build();
- }
-
- @Override
- public void preStart() throws Exception {
- super.preStart();
- log.debug("[WorkerRequestAkkaHandler]init WorkerRequestActor");
- }
-
-
- @Override
- public void postStop() throws Exception {
- super.postStop();
- log.debug("[WorkerRequestAkkaHandler]stop WorkerRequestActor");
- }
-
- /**
- * 处理 instance 状态
- * @param req 任务实例的状态上报请求
- */
- private void onReceiveTaskTrackerReportInstanceStatusReq(TaskTrackerReportInstanceStatusReq req) {
-
- try {
- Optional askResponseOpt = fetchWorkerRequestHandler().processTaskTrackerReportInstanceStatus(req);
- if (askResponseOpt.isPresent()) {
- getSender().tell(AskResponse.succeed(null), getSelf());
- }
- }catch (Exception e) {
- log.error("[WorkerRequestAkkaHandler] update instance status failed for request: {}.", req, e);
- }
- }
-
- /**
- * 处理 Worker容器部署请求
- * @param req 容器部署请求
- */
- private void onReceiveWorkerNeedDeployContainerRequest(WorkerNeedDeployContainerRequest req) {
- getSender().tell(fetchWorkerRequestHandler().processWorkerNeedDeployContainer(req), getSelf());
- }
-
- /**
- * 处理 worker 请求获取当前任务所有处理器节点的请求
- * @param req jobId + appId
- */
- private void onReceiveWorkerQueryExecutorClusterReq(WorkerQueryExecutorClusterReq req) {
-
- getSender().tell(fetchWorkerRequestHandler().processWorkerQueryExecutorCluster(req), getSelf());
- }
-
-}
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestHttpHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestHttpHandler.java
deleted file mode 100644
index 3749158f..00000000
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/impl/WorkerRequestHttpHandler.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package tech.powerjob.server.core.handler.impl;
-
-import tech.powerjob.common.OmsConstant;
-import tech.powerjob.common.ProtocolConstant;
-import tech.powerjob.common.request.TaskTrackerReportInstanceStatusReq;
-import tech.powerjob.common.request.WorkerHeartbeat;
-import tech.powerjob.common.request.WorkerLogReportReq;
-import tech.powerjob.common.response.AskResponse;
-import tech.powerjob.common.response.ResultDTO;
-import tech.powerjob.server.common.PowerJobServerConfigKey;
-import tech.powerjob.server.common.utils.PropertyUtils;
-import io.vertx.core.AbstractVerticle;
-import io.vertx.core.http.HttpServer;
-import io.vertx.core.http.HttpServerOptions;
-import io.vertx.core.json.JsonObject;
-import io.vertx.ext.web.Router;
-import io.vertx.ext.web.RoutingContext;
-import io.vertx.ext.web.handler.BodyHandler;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-
-import java.util.Properties;
-
-import static tech.powerjob.server.core.handler.WorkerRequestHandlerHolder.fetchWorkerRequestHandler;
-
-/**
- * WorkerRequestHandler
- *
- * @author tjq
- * @since 2021/2/8
- */
-@Slf4j
-public class WorkerRequestHttpHandler extends AbstractVerticle {
-
- @Override
- public void start() throws Exception {
-
- Properties properties = PropertyUtils.getProperties();
- int port = Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.HTTP_PORT, String.valueOf(OmsConstant.SERVER_DEFAULT_HTTP_PORT)));
-
- HttpServerOptions options = new HttpServerOptions();
- HttpServer server = vertx.createHttpServer(options);
-
- Router router = Router.router(vertx);
- router.route().handler(BodyHandler.create());
- router.post(ProtocolConstant.SERVER_PATH_HEARTBEAT)
- .handler(ctx -> {
- WorkerHeartbeat heartbeat = ctx.getBodyAsJson().mapTo(WorkerHeartbeat.class);
- fetchWorkerRequestHandler().processWorkerHeartbeat(heartbeat);
- success(ctx);
- });
- router.post(ProtocolConstant.SERVER_PATH_STATUS_REPORT)
- .blockingHandler(ctx -> {
- TaskTrackerReportInstanceStatusReq req = ctx.getBodyAsJson().mapTo(TaskTrackerReportInstanceStatusReq.class);
- try {
- fetchWorkerRequestHandler().processTaskTrackerReportInstanceStatus(req);
- out(ctx, AskResponse.succeed(null));
- } catch (Exception e) {
- log.error("[WorkerRequestHttpHandler] update instance status failed for request: {}.", req, e);
- out(ctx, AskResponse.failed(ExceptionUtils.getMessage(e)));
- }
- });
- router.post(ProtocolConstant.SERVER_PATH_LOG_REPORT)
- .blockingHandler(ctx -> {
- WorkerLogReportReq req = ctx.getBodyAsJson().mapTo(WorkerLogReportReq.class);
- fetchWorkerRequestHandler().processWorkerLogReport(req);
- success(ctx);
- });
- server.requestHandler(router).listen(port);
- }
-
- private static void out(RoutingContext ctx, Object msg) {
- ctx.response()
- .putHeader(OmsConstant.HTTP_HEADER_CONTENT_TYPE, OmsConstant.JSON_MEDIA_TYPE)
- .end(JsonObject.mapFrom(msg).encode());
- }
-
- private static void success(RoutingContext ctx) {
- out(ctx, ResultDTO.success(null));
- }
-}
From b746aa18593e21aa361e6ab3328ee171cefa3f45 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 11:05:24 +0800
Subject: [PATCH 062/100] feat: redefine PowerAkkaSerializer
---
.../main/java/tech/powerjob/common/PowerSerializable.java | 8 --------
.../tech/powerjob/remote/akka}/PowerAkkaSerializer.java | 4 +++-
.../src/main/resources/powerjob.akka.conf | 2 +-
3 files changed, 4 insertions(+), 10 deletions(-)
rename {powerjob-common/src/main/java/tech/powerjob/common/serialize => powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka}/PowerAkkaSerializer.java (87%)
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/PowerSerializable.java b/powerjob-common/src/main/java/tech/powerjob/common/PowerSerializable.java
index 48a59ab5..e8dd990f 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/PowerSerializable.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/PowerSerializable.java
@@ -9,12 +9,4 @@ import java.io.Serializable;
* @since 2020/4/16
*/
public interface PowerSerializable extends Serializable {
-
- /**
- * request path for http or other protocol, like '/worker/stopInstance'
- * @return null for non-http request object or no-null path for http request needed object
- */
- default String path() {
- return null;
- }
}
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/serialize/PowerAkkaSerializer.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/PowerAkkaSerializer.java
similarity index 87%
rename from powerjob-common/src/main/java/tech/powerjob/common/serialize/PowerAkkaSerializer.java
rename to powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/PowerAkkaSerializer.java
index 2f05dd6f..ba58b841 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/serialize/PowerAkkaSerializer.java
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/PowerAkkaSerializer.java
@@ -1,6 +1,7 @@
-package tech.powerjob.common.serialize;
+package tech.powerjob.remote.akka;
import akka.serialization.JSerializer;
+import tech.powerjob.common.serialize.SerializerUtils;
/**
* Using custom serializers for akka-remote
@@ -31,3 +32,4 @@ public class PowerAkkaSerializer extends JSerializer {
return false;
}
}
+
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/resources/powerjob.akka.conf b/powerjob-remote/powerjob-remote-impl-akka/src/main/resources/powerjob.akka.conf
index f34e043e..8bd7ab69 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/src/main/resources/powerjob.akka.conf
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/resources/powerjob.akka.conf
@@ -9,7 +9,7 @@ akka {
allow-java-serialization = off
serializers {
- power-serializer = "tech.powerjob.common.serialize.PowerAkkaSerializer"
+ power-serializer = "tech.powerjob.remote.akka.PowerAkkaSerializer"
}
serialization-bindings {
From 25c6a9a6d64d98e348fc976881fed33c00b06f8d Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 11:10:51 +0800
Subject: [PATCH 063/100] feat: remove PowerSerializable's path method
---
.../tech/powerjob/common/ProtocolConstant.java | 18 ------------------
.../tech/powerjob/common/RemoteConstant.java | 12 ------------
.../request/ServerQueryInstanceStatusReq.java | 7 +------
.../common/request/ServerScheduleJobReq.java | 8 +-------
.../common/request/ServerStopInstanceReq.java | 8 +-------
5 files changed, 3 insertions(+), 50 deletions(-)
delete mode 100644 powerjob-common/src/main/java/tech/powerjob/common/ProtocolConstant.java
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/ProtocolConstant.java b/powerjob-common/src/main/java/tech/powerjob/common/ProtocolConstant.java
deleted file mode 100644
index 9136ce35..00000000
--- a/powerjob-common/src/main/java/tech/powerjob/common/ProtocolConstant.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package tech.powerjob.common;
-
-/**
- * HttpProtocolConstant
- *
- * @author tjq
- * @since 2021/2/8
- */
-public class ProtocolConstant {
-
- public static final String SERVER_PATH_HEARTBEAT = "/server/heartbeat";
- public static final String SERVER_PATH_STATUS_REPORT = "/server/statusReport";
- public static final String SERVER_PATH_LOG_REPORT = "/server/logReport";
-
- public static final String WORKER_PATH_DISPATCH_JOB = "/worker/runJob";
- public static final String WORKER_PATH_STOP_INSTANCE = "/worker/stopInstance";
- public static final String WORKER_PATH_QUERY_INSTANCE_INFO = "/worker/queryInstanceInfo";
-}
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java b/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java
index a2d751ec..0ee242df 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/RemoteConstant.java
@@ -12,18 +12,6 @@ public class RemoteConstant {
/* ************************ AKKA WORKER ************************ */
public static final int DEFAULT_WORKER_PORT = 27777;
- public static final String WORKER_ACTOR_SYSTEM_NAME = "oms";
-
- public static final String WORKER_ACTOR_NAME = "worker";
-
-
- /* ************************ AKKA SERVER ************************ */
- public static final String SERVER_ACTOR_SYSTEM_NAME = "oms-server";
-
- public static final String SERVER_ACTOR_NAME = "server_actor";
- public static final String SERVER_FRIEND_ACTOR_NAME = "friend_actor";
- public static final String SERVER_AKKA_CONFIG_NAME = "oms-server.akka.conf";
-
/* ************************ OTHERS ************************ */
public static final String EMPTY_ADDRESS = "N/A";
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerQueryInstanceStatusReq.java b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerQueryInstanceStatusReq.java
index 6cf1a985..a37dfbf2 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerQueryInstanceStatusReq.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerQueryInstanceStatusReq.java
@@ -1,10 +1,9 @@
package tech.powerjob.common.request;
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.ProtocolConstant;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import tech.powerjob.common.PowerSerializable;
/**
* 服务器查询实例运行状态,需要返回详细的运行数据
@@ -18,8 +17,4 @@ import lombok.NoArgsConstructor;
public class ServerQueryInstanceStatusReq implements PowerSerializable {
private Long instanceId;
- @Override
- public String path() {
- return ProtocolConstant.WORKER_PATH_QUERY_INSTANCE_INFO;
- }
}
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerScheduleJobReq.java b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerScheduleJobReq.java
index 364aba55..ac8df503 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerScheduleJobReq.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerScheduleJobReq.java
@@ -1,8 +1,7 @@
package tech.powerjob.common.request;
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.ProtocolConstant;
import lombok.Data;
+import tech.powerjob.common.PowerSerializable;
import java.util.List;
@@ -98,9 +97,4 @@ public class ServerScheduleJobReq implements PowerSerializable {
* 日志配置
*/
private String logConfig;
-
- @Override
- public String path() {
- return ProtocolConstant.WORKER_PATH_DISPATCH_JOB;
- }
}
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerStopInstanceReq.java b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerStopInstanceReq.java
index 000eb993..765e6f07 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerStopInstanceReq.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerStopInstanceReq.java
@@ -1,10 +1,9 @@
package tech.powerjob.common.request;
-import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.ProtocolConstant;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import tech.powerjob.common.PowerSerializable;
/**
@@ -18,9 +17,4 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class ServerStopInstanceReq implements PowerSerializable {
private Long instanceId;
-
- @Override
- public String path() {
- return ProtocolConstant.WORKER_PATH_STOP_INSTANCE;
- }
}
From bfb9c68590d0f993751bf4a3bbe947c5d8e1980e Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 22:37:18 +0800
Subject: [PATCH 064/100] feat: close remoteEngine when jvm exit
---
.../remote/framework/engine/RemoteEngine.java | 4 +-
.../engine/impl/PowerJobRemoteEngine.java | 9 +++--
powerjob-server/pom.xml | 7 ++++
.../core/handler/IWorkerRequestHandler.java | 3 +-
.../server/remote/actoes/ServerActor.java | 10 -----
.../server/remote/server/FriendActor.java | 6 +--
.../impl/PowerTransportService.java | 39 ++++++++++++++++---
7 files changed, 53 insertions(+), 25 deletions(-)
delete mode 100644 powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
index a591f2a9..e86d2722 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
@@ -1,5 +1,7 @@
package tech.powerjob.remote.framework.engine;
+import java.io.IOException;
+
/**
* RemoteEngine
*
@@ -10,5 +12,5 @@ public interface RemoteEngine {
EngineOutput start(EngineConfig engineConfig);
- void close();
+ void close() throws IOException;
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
index 5292d4e7..dc09fdf5 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
@@ -10,6 +10,7 @@ import tech.powerjob.remote.framework.engine.EngineOutput;
import tech.powerjob.remote.framework.engine.RemoteEngine;
import tech.powerjob.remote.framework.transporter.Transporter;
+import java.io.IOException;
import java.util.List;
/**
@@ -21,6 +22,8 @@ import java.util.List;
@Slf4j
public class PowerJobRemoteEngine implements RemoteEngine {
+ private CSInitializer csInitializer;
+
@Override
public EngineOutput start(EngineConfig engineConfig) {
@@ -28,7 +31,7 @@ public class PowerJobRemoteEngine implements RemoteEngine {
log.info("[PowerJobRemoteEngine] start remote engine with config: {}", engineConfig);
List actorInfos = ActorFactory.load(engineConfig.getActorList());
- CSInitializer csInitializer = CSInitializerFactory.build(engineConfig.getType());
+ csInitializer = CSInitializerFactory.build(engineConfig.getType());
String type = csInitializer.type();
@@ -53,7 +56,7 @@ public class PowerJobRemoteEngine implements RemoteEngine {
}
@Override
- public void close() {
-
+ public void close() throws IOException {
+ csInitializer.close();
}
}
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index b9cc9460..c0aa342a 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -49,6 +49,8 @@
3.0.10
9.1.6
+
+ 4.2.1
4.2.1
4.2.1
@@ -101,6 +103,11 @@
+
+ tech.powerjob
+ powerjob-common
+ ${powerjob-common.version}
+
tech.powerjob
powerjob-remote-impl-http
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
index a5231685..9aac2484 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
@@ -4,7 +4,6 @@ import tech.powerjob.common.request.*;
import tech.powerjob.common.response.AskResponse;
import tech.powerjob.remote.framework.actor.Handler;
import tech.powerjob.remote.framework.actor.ProcessType;
-import tech.powerjob.server.remote.actoes.ServerActor;
import java.util.Optional;
@@ -16,7 +15,7 @@ import static tech.powerjob.common.RemoteConstant.*;
* @author tjq
* @since 2022/9/10
*/
-public interface IWorkerRequestHandler extends ServerActor {
+public interface IWorkerRequestHandler {
/**
* 处理 worker 上报的心跳信息
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java
deleted file mode 100644
index 04f6fa60..00000000
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/actoes/ServerActor.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package tech.powerjob.server.remote.actoes;
-
-/**
- * ServerActor 声明接口
- *
- * @author tjq
- * @since 2023/1/21
- */
-public interface ServerActor {
-}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
index 5e3ceeb2..e6d066cc 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
@@ -5,9 +5,9 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.stereotype.Component;
import tech.powerjob.common.response.AskResponse;
import tech.powerjob.common.serialize.JsonUtils;
+import tech.powerjob.remote.framework.actor.Actor;
import tech.powerjob.remote.framework.actor.Handler;
import tech.powerjob.remote.framework.actor.ProcessType;
-import tech.powerjob.server.remote.actoes.ServerActor;
import tech.powerjob.server.remote.server.election.Ping;
import tech.powerjob.server.remote.server.redirector.RemoteProcessReq;
import tech.powerjob.server.remote.server.redirector.RemoteRequestProcessor;
@@ -22,8 +22,8 @@ import static tech.powerjob.common.RemoteConstant.*;
*/
@Slf4j
@Component
-@Handler(path = S4S_PATH)
-public class FriendActor implements ServerActor {
+@Actor(path = S4S_PATH)
+public class FriendActor {
private static final String SK = "dGVuZ2ppcWlAZ21haWwuY29tIA==";
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
index 8654f76d..26dad376 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
@@ -5,14 +5,19 @@ import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import tech.powerjob.common.OmsConstant;
import tech.powerjob.common.PowerSerializable;
import tech.powerjob.common.enums.Protocol;
import tech.powerjob.common.utils.NetUtils;
+import tech.powerjob.remote.framework.actor.Actor;
import tech.powerjob.remote.framework.base.Address;
import tech.powerjob.remote.framework.base.RemotingException;
import tech.powerjob.remote.framework.base.ServerType;
@@ -21,7 +26,6 @@ import tech.powerjob.remote.framework.engine.EngineConfig;
import tech.powerjob.remote.framework.engine.EngineOutput;
import tech.powerjob.remote.framework.engine.RemoteEngine;
import tech.powerjob.remote.framework.engine.impl.PowerJobRemoteEngine;
-import tech.powerjob.server.remote.actoes.ServerActor;
import tech.powerjob.server.remote.transporter.ProtocolInfo;
import tech.powerjob.server.remote.transporter.TransportService;
@@ -37,20 +41,22 @@ import java.util.concurrent.CompletionStage;
*/
@Slf4j
@Service
-public class PowerTransportService implements TransportService, InitializingBean {
+public class PowerTransportService implements TransportService, InitializingBean, DisposableBean, ApplicationContextAware {
@Value("${oms.transporter.active.protocols}")
private String activeProtocols;
private static final String PROTOCOL_PORT_CONFIG = "oms.%s.port";
private final Environment environment;
- private final List serverActors;
private ProtocolInfo defaultProtocol;
private final Map protocol2Transporter = Maps.newHashMap();
- public PowerTransportService(List serverActors, Environment environment) {
- this.serverActors = serverActors;
+ private final List engines = Lists.newArrayList();
+
+ private ApplicationContext applicationContext;
+
+ public PowerTransportService(Environment environment) {
this.environment = environment;
}
@@ -80,6 +86,11 @@ public class PowerTransportService implements TransportService, InitializingBean
}
private void initRemoteFrameWork(String protocol, int port) {
+
+ // 从构造器注入改为从 applicationContext 获取来避免循环依赖
+ final Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(Actor.class);
+ log.info("[PowerTransportService] find Actor num={},names={}", beansWithAnnotation.size(), beansWithAnnotation.keySet());
+
Address address = new Address()
.setHost(NetUtils.getLocalHost())
.setPort(port);
@@ -87,12 +98,13 @@ public class PowerTransportService implements TransportService, InitializingBean
.setServerType(ServerType.SERVER)
.setType(protocol.toUpperCase())
.setBindAddress(address)
- .setActorList(Lists.newArrayList(serverActors));
+ .setActorList(Lists.newArrayList(beansWithAnnotation.values()));
log.info("[PowerTransportService] start to initialize RemoteEngine[type={},address={}]", protocol, address);
RemoteEngine re = new PowerJobRemoteEngine();
final EngineOutput engineOutput = re.start(engineConfig);
log.info("[PowerTransportService] start RemoteEngine[type={},address={}] successfully", protocol, address);
+ this.engines.add(re);
this.protocol2Transporter.put(protocol, new ProtocolInfo(protocol, address.toFullAddress(), engineOutput.getTransporter()));
}
@@ -168,4 +180,19 @@ public class PowerTransportService implements TransportService, InitializingBean
throw new IllegalArgumentException("can't find default protocol, please check your config!");
}
}
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = applicationContext;
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ engines.forEach(e -> {
+ try {
+ e.close();
+ } catch (Exception ignore) {
+ }
+ });
+ }
}
From 4fece7be4081df0a5169d22966be642a8fe26163 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 23:13:28 +0800
Subject: [PATCH 065/100] feat: optimize remote framework log output
---
.../framework/engine/impl/ActorFactory.java | 27 ++++++++++++-------
.../engine/impl/PowerJobRemoteEngine.java | 12 ++++++---
.../powerjob/remote/akka/AkkaProxyActor.java | 1 -
.../remote/http/HttpVertxCSInitializer.java | 4 ---
.../core/handler/AbWorkerRequestHandler.java | 9 +++++++
.../core/handler/IWorkerRequestHandler.java | 9 -------
.../server/remote/server/FriendActor.java | 2 +-
7 files changed, 35 insertions(+), 29 deletions(-)
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/ActorFactory.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/ActorFactory.java
index 21f6e430..cfd9108c 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/ActorFactory.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/ActorFactory.java
@@ -2,18 +2,15 @@ package tech.powerjob.remote.framework.engine.impl;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.reflections.ReflectionUtils;
-import org.reflections.Reflections;
-import tech.powerjob.common.OmsConstant;
-import tech.powerjob.common.exception.PowerJobException;
-import tech.powerjob.remote.framework.actor.*;
+import tech.powerjob.remote.framework.actor.Actor;
+import tech.powerjob.remote.framework.actor.ActorInfo;
+import tech.powerjob.remote.framework.actor.Handler;
+import tech.powerjob.remote.framework.actor.HandlerInfo;
import tech.powerjob.remote.framework.base.HandlerLocation;
import java.lang.reflect.Method;
import java.util.List;
-import java.util.Set;
/**
* load all Actor
@@ -53,7 +50,12 @@ class ActorFactory {
String rootPath = anno.path();
Object actor = actorInfo.getActor();
- Method[] declaredMethods = actor.getClass().getDeclaredMethods();
+ findHandlerMethod(rootPath, actor.getClass(), ret);
+ return ret;
+ }
+
+ private static void findHandlerMethod(String rootPath, Class> clz, List result) {
+ Method[] declaredMethods = clz.getDeclaredMethods();
for (Method handlerMethod: declaredMethods) {
Handler handlerMethodAnnotation = handlerMethod.getAnnotation(Handler.class);
if (handlerMethodAnnotation == null) {
@@ -68,9 +70,14 @@ class ActorFactory {
.setAnno(handlerMethodAnnotation)
.setMethod(handlerMethod)
.setLocation(handlerLocation);
- ret.add(handlerInfo);
+ result.add(handlerInfo);
+ }
+
+ // 递归处理父类
+ final Class> superclass = clz.getSuperclass();
+ if (superclass != null) {
+ findHandlerMethod(rootPath, superclass, result);
}
- return ret;
}
static String suitPath(String path) {
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
index dc09fdf5..2f9cbc6b 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
@@ -27,16 +27,17 @@ public class PowerJobRemoteEngine implements RemoteEngine {
@Override
public EngineOutput start(EngineConfig engineConfig) {
+ final String engineType = engineConfig.getType();
EngineOutput engineOutput = new EngineOutput();
- log.info("[PowerJobRemoteEngine] start remote engine with config: {}", engineConfig);
+ log.info("[PowerJobRemoteEngine] [{}] start remote engine with config: {}", engineType, engineConfig);
List actorInfos = ActorFactory.load(engineConfig.getActorList());
- csInitializer = CSInitializerFactory.build(engineConfig.getType());
+ csInitializer = CSInitializerFactory.build(engineType);
String type = csInitializer.type();
Stopwatch sw = Stopwatch.createStarted();
- log.info("[PowerJobRemoteEngine] try to startup CSInitializer[type={}]", type);
+ log.info("[PowerJobRemoteEngine] [{}] try to startup CSInitializer[type={}]", engineType, type);
csInitializer.init(new CSInitializerConfig()
.setBindAddress(engineConfig.getBindAddress())
@@ -47,10 +48,13 @@ public class PowerJobRemoteEngine implements RemoteEngine {
Transporter transporter = csInitializer.buildTransporter();
engineOutput.setTransporter(transporter);
+ log.info("[PowerJobRemoteEngine] [{}] start to bind Handler", engineType);
+ actorInfos.forEach(actor -> actor.getHandlerInfos().forEach(handlerInfo -> log.info("[PowerJobRemoteEngine] [{}] PATH={}, handler={}", engineType, handlerInfo.getLocation().toPath(), handlerInfo.getMethod())));
+
// 绑定 handler
csInitializer.bindHandlers(actorInfos);
- log.info("[PowerJobRemoteEngine] startup CSInitializer[type={}] successfully, cost: {}", type, sw);
+ log.info("[PowerJobRemoteEngine] [{}] startup successfully, cost: {}", engineType, sw);
return engineOutput;
}
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java
index b2d2fc5e..af4f9441 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaProxyActor.java
@@ -41,7 +41,6 @@ public class AkkaProxyActor extends AbstractActor {
}
final Class> bindClz = powerSerializeClz.get();
receiveBuilder.match(bindClz, req -> onReceiveProcessorReportTaskStatusReq(req, handlerInfo));
- log.info("[PowerJob-AKKA] bind handler[{}] to [{}]", location, bindClz);
});
this.receive = receiveBuilder.build();
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java
index dbf62bd8..3b2012f9 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java
@@ -75,12 +75,9 @@ public class HttpVertxCSInitializer implements CSInitializer {
// 处理请求响应
router.route().handler(BodyHandler.create());
actorInfos.forEach(actorInfo -> {
- log.info("[PowerJob-Vertx] start to bind Actor[{}]'s handler!", actorInfo.getAnno().path());
Optional.ofNullable(actorInfo.getHandlerInfos()).orElse(Collections.emptyList()).forEach(handlerInfo -> {
- Method method = handlerInfo.getMethod();
String handlerHttpPath = handlerInfo.getLocation().toPath();
ProcessType processType = handlerInfo.getAnno().processType();
- log.info("[PowerJob-Vertx] start to register Handler with[path={},methodName={},processType={}]", handlerHttpPath, method.getName(), processType);
Handler routingContextHandler = buildRequestHandler(actorInfo, handlerInfo);
Route route = router.post(handlerHttpPath);
@@ -89,7 +86,6 @@ public class HttpVertxCSInitializer implements CSInitializer {
} else {
route.handler(routingContextHandler);
}
- log.info("[PowerJob-Vertx] register Handler[path={},methodName={}] successfully!", handlerHttpPath, method.getName());
});
});
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java
index b0e8047c..c13c4cf6 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java
@@ -10,6 +10,8 @@ import tech.powerjob.common.request.*;
import tech.powerjob.common.response.AskResponse;
import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.common.utils.NetUtils;
+import tech.powerjob.remote.framework.actor.Handler;
+import tech.powerjob.remote.framework.actor.ProcessType;
import tech.powerjob.server.common.constants.SwitchableStatus;
import tech.powerjob.server.common.module.WorkerInfo;
import tech.powerjob.server.common.utils.SpringUtils;
@@ -28,6 +30,8 @@ import java.util.Optional;
import java.util.concurrent.RejectedExecutionException;
import java.util.stream.Collectors;
+import static tech.powerjob.common.RemoteConstant.*;
+
/**
* wrapper monitor for IWorkerRequestHandler
*
@@ -55,6 +59,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
@Override
+ @Handler(path = S4W_HANDLER_WORKER_HEARTBEAT, processType = ProcessType.NO_BLOCKING)
public void processWorkerHeartbeat(WorkerHeartbeat heartbeat) {
long startMs = System.currentTimeMillis();
WorkerHeartbeatEvent event = new WorkerHeartbeatEvent()
@@ -71,6 +76,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
}
@Override
+ @Handler(path = S4W_HANDLER_REPORT_INSTANCE_STATUS, processType = ProcessType.BLOCKING)
public Optional processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req) {
long startMs = System.currentTimeMillis();
TtReportInstanceStatusEvent event = new TtReportInstanceStatusEvent()
@@ -94,6 +100,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
}
@Override
+ @Handler(path = S4W_HANDLER_REPORT_LOG, processType = ProcessType.NO_BLOCKING)
public void processWorkerLogReport(WorkerLogReportReq req) {
WorkerLogReportEvent event = new WorkerLogReportEvent()
@@ -113,6 +120,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
}
@Override
+ @Handler(path = S4W_HANDLER_QUERY_JOB_CLUSTER, processType = ProcessType.BLOCKING)
public AskResponse processWorkerQueryExecutorCluster(WorkerQueryExecutorClusterReq req) {
AskResponse askResponse;
@@ -137,6 +145,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
}
@Override
+ @Handler(path = S4W_HANDLER_WORKER_NEED_DEPLOY_CONTAINER, processType = ProcessType.BLOCKING)
public AskResponse processWorkerNeedDeployContainer(WorkerNeedDeployContainerRequest req) {
String port = environment.getProperty("local.server.port");
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
index 9aac2484..e55c1903 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
@@ -2,13 +2,9 @@ package tech.powerjob.server.core.handler;
import tech.powerjob.common.request.*;
import tech.powerjob.common.response.AskResponse;
-import tech.powerjob.remote.framework.actor.Handler;
-import tech.powerjob.remote.framework.actor.ProcessType;
import java.util.Optional;
-import static tech.powerjob.common.RemoteConstant.*;
-
/**
* 定义 server 与 worker 之间需要处理的协议
*
@@ -21,7 +17,6 @@ public interface IWorkerRequestHandler {
* 处理 worker 上报的心跳信息
* @param heartbeat 心跳信息
*/
- @Handler(path = S4W_HANDLER_WORKER_HEARTBEAT, processType = ProcessType.NO_BLOCKING)
void processWorkerHeartbeat(WorkerHeartbeat heartbeat);
/**
@@ -29,7 +24,6 @@ public interface IWorkerRequestHandler {
* @param req 上报请求
* @return 响应信息
*/
- @Handler(path = S4W_HANDLER_REPORT_INSTANCE_STATUS, processType = ProcessType.BLOCKING)
Optional processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req);
/**
@@ -37,14 +31,12 @@ public interface IWorkerRequestHandler {
* @param req 请求
* @return cluster info
*/
- @Handler(path = S4W_HANDLER_QUERY_JOB_CLUSTER, processType = ProcessType.BLOCKING)
AskResponse processWorkerQueryExecutorCluster(WorkerQueryExecutorClusterReq req);
/**
* 处理 worker 日志推送请求(内部使用线程池异步处理,非阻塞)
* @param req 请求
*/
- @Handler(path = S4W_HANDLER_REPORT_LOG, processType = ProcessType.NO_BLOCKING)
void processWorkerLogReport(WorkerLogReportReq req);
/**
@@ -52,6 +44,5 @@ public interface IWorkerRequestHandler {
* @param request 请求
* @return 容器部署信息
*/
- @Handler(path = S4W_HANDLER_WORKER_NEED_DEPLOY_CONTAINER, processType = ProcessType.BLOCKING)
AskResponse processWorkerNeedDeployContainer(WorkerNeedDeployContainerRequest request);
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
index e6d066cc..3174780d 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
@@ -36,7 +36,7 @@ public class FriendActor {
}
@Handler(path = S4S_HANDLER_PROCESS, processType = ProcessType.BLOCKING)
- private AskResponse onReceiveRemoteProcessReq(RemoteProcessReq req) {
+ public AskResponse onReceiveRemoteProcessReq(RemoteProcessReq req) {
AskResponse response = new AskResponse();
response.setSuccess(true);
From 571b7cf3f215afd7dfd19b1330f2e6a10a41e774 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 21 Jan 2023 23:15:45 +0800
Subject: [PATCH 066/100] feat: optimize remote framework log output
---
.../java/tech/powerjob/remote/http/HttpVertxCSInitializer.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java
index 3b2012f9..9d37a6e8 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java
@@ -100,7 +100,7 @@ public class HttpVertxCSInitializer implements CSInitializer {
.toCompletableFuture()
.get(1, TimeUnit.MINUTES);
- log.info("[PowerJob] startup vertx HttpServer successfully!");
+ log.info("[PowerJobRemoteEngine] startup vertx HttpServer successfully!");
}
private Handler buildRequestHandler(ActorInfo actorInfo, HandlerInfo handlerInfo) {
From e26f2df2d00d0cab725f237108a3f930957a37cf Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 00:33:11 +0800
Subject: [PATCH 067/100] fix: server elect bug
---
.../tech/powerjob/common/OmsConstant.java | 4 ++
.../request/ServerDiscoveryRequest.java | 59 +++++++++++++++++++
.../powerjob/common/serialize/JsonUtils.java | 23 ++++----
.../server/remote/server/FriendActor.java | 10 +++-
.../election/ServerElectionService.java | 43 +++++++++-----
.../redirector/DesignateServerAspect.java | 2 +-
.../remote/transporter/ProtocolInfo.java | 8 ++-
.../remote/transporter/TransportService.java | 7 +++
.../impl/PowerTransportService.java | 17 ++++--
.../web/controller/ServerController.java | 5 +-
.../background/ServerDiscoveryService.java | 18 +++++-
11 files changed, 154 insertions(+), 42 deletions(-)
create mode 100644 powerjob-common/src/main/java/tech/powerjob/common/request/ServerDiscoveryRequest.java
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/OmsConstant.java b/powerjob-common/src/main/java/tech/powerjob/common/OmsConstant.java
index bed70eca..f589e869 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/OmsConstant.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/OmsConstant.java
@@ -22,6 +22,10 @@ public class OmsConstant {
public static final String NONE = "N/A";
public static final String COMMA = ",";
+
+ public static final String AND = "&";
+
+ public static final String EQUAL = "=";
public static final String LINE_SEPARATOR = "\r\n";
public static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type";
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/request/ServerDiscoveryRequest.java b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerDiscoveryRequest.java
new file mode 100644
index 00000000..34a7d6bd
--- /dev/null
+++ b/powerjob-common/src/main/java/tech/powerjob/common/request/ServerDiscoveryRequest.java
@@ -0,0 +1,59 @@
+package tech.powerjob.common.request;
+
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.StringUtils;
+import tech.powerjob.common.enums.Protocol;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 服务发现请求
+ *
+ * @author tjq
+ * @since 2023/1/21
+ */
+@Setter
+@Accessors(chain = true)
+public class ServerDiscoveryRequest implements Serializable {
+
+ private Long appId;
+
+ private String protocol;
+
+ private String currentServer;
+
+ private String clientVersion;
+
+ public Map toMap() {
+ Map ret = new HashMap<>();
+ ret.put("appId", appId);
+ ret.put("protocol", protocol);
+ if (StringUtils.isNotEmpty(currentServer)) {
+ ret.put("currentServer", currentServer);
+ }
+ if (StringUtils.isNotEmpty(clientVersion)) {
+ ret.put("clientVersion", clientVersion);
+ }
+ return ret;
+ }
+
+ public Long getAppId() {
+ return appId;
+ }
+
+ public String getProtocol() {
+ return Optional.ofNullable(protocol).orElse(Protocol.AKKA.name());
+ }
+
+ public String getCurrentServer() {
+ return currentServer;
+ }
+
+ public String getClientVersion() {
+ return clientVersion;
+ }
+}
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java b/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java
index 6809fa4c..ee40566a 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java
@@ -3,10 +3,11 @@ package tech.powerjob.common.serialize;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.json.JsonMapper;
import lombok.extern.slf4j.Slf4j;
-import tech.powerjob.common.exception.PowerJobException;
import org.apache.commons.lang3.exception.ExceptionUtils;
+import tech.powerjob.common.exception.PowerJobException;
import java.io.IOException;
@@ -19,13 +20,11 @@ import java.io.IOException;
@Slf4j
public class JsonUtils {
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
- static {
- OBJECT_MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
- //
- OBJECT_MAPPER.configure(JsonParser.Feature.IGNORE_UNDEFINED, true);
- }
+ private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder()
+ .configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
+ .configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
+ .configure(JsonParser.Feature.IGNORE_UNDEFINED, true)
+ .build();
private JsonUtils(){
@@ -34,7 +33,8 @@ public class JsonUtils {
public static String toJSONString(Object obj) {
try {
return OBJECT_MAPPER.writeValueAsString(obj);
- }catch (Exception ignore) {
+ }catch (Exception e) {
+ log.error("[PowerJob] toJSONString failed", e);
}
return null;
}
@@ -50,7 +50,8 @@ public class JsonUtils {
public static byte[] toBytes(Object obj) {
try {
return OBJECT_MAPPER.writeValueAsBytes(obj);
- }catch (Exception ignore) {
+ }catch (Exception e) {
+ log.error("[PowerJob] serialize failed", e);
}
return null;
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
index 3174780d..0b5a848f 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
@@ -11,6 +11,7 @@ import tech.powerjob.remote.framework.actor.ProcessType;
import tech.powerjob.server.remote.server.election.Ping;
import tech.powerjob.server.remote.server.redirector.RemoteProcessReq;
import tech.powerjob.server.remote.server.redirector.RemoteRequestProcessor;
+import tech.powerjob.server.remote.transporter.TransportService;
import static tech.powerjob.common.RemoteConstant.*;
@@ -25,14 +26,19 @@ import static tech.powerjob.common.RemoteConstant.*;
@Actor(path = S4S_PATH)
public class FriendActor {
- private static final String SK = "dGVuZ2ppcWlAZ21haWwuY29tIA==";
+ private final TransportService transportService;
+
+ public FriendActor(TransportService transportService) {
+ this.transportService = transportService;
+ }
/**
* 处理存活检测的请求
*/
@Handler(path = S4S_HANDLER_PING, processType = ProcessType.NO_BLOCKING)
public AskResponse onReceivePing(Ping ping) {
- return AskResponse.succeed(SK);
+ final AskResponse response = AskResponse.succeed(transportService.allProtocols());
+ return response;
}
@Handler(path = S4S_HANDLER_PROCESS, processType = ProcessType.BLOCKING)
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
index b3871159..37eb4639 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
@@ -1,5 +1,6 @@
package tech.powerjob.server.remote.server.election;
+import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -7,11 +8,14 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import tech.powerjob.common.enums.Protocol;
import tech.powerjob.common.exception.PowerJobException;
+import tech.powerjob.common.request.ServerDiscoveryRequest;
import tech.powerjob.common.response.AskResponse;
+import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.extension.LockService;
import tech.powerjob.server.persistence.remote.model.AppInfoDO;
import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
+import tech.powerjob.server.remote.transporter.ProtocolInfo;
import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
import tech.powerjob.server.remote.transporter.TransportService;
@@ -50,18 +54,21 @@ public class ServerElectionService {
this.accurateSelectServerPercentage = accurateSelectServerPercentage;
}
- public String elect(Long appId, String protocol, String currentServer) {
+ public String elect(ServerDiscoveryRequest request) {
if (!accurate()) {
// 如果是本机,就不需要查数据库那么复杂的操作了,直接返回成功
- if (transportService.defaultProtocol().getAddress().equals(currentServer)) {
- return currentServer;
+ Optional localProtocolInfoOpt = Optional.ofNullable(transportService.allProtocols().get(request.getProtocol()));
+ if (localProtocolInfoOpt.isPresent() && localProtocolInfoOpt.get().getAddress().equals(request.getCurrentServer())) {
+ return request.getCurrentServer();
}
}
- return getServer0(appId, protocol);
+ return getServer0(request);
}
- private String getServer0(Long appId, String protocol) {
+ private String getServer0(ServerDiscoveryRequest discoveryRequest) {
+ final Long appId = discoveryRequest.getAppId();
+ final String protocol = discoveryRequest.getProtocol();
Set downServerCache = Sets.newHashSet();
for (int i = 0; i < RETRY_TIMES; i++) {
@@ -97,15 +104,17 @@ public class ServerElectionService {
return address;
}
- // 篡位,本机作为Server
- // 注意,写入 AppInfoDO#currentServer 的永远是 ActorSystem 的地址,仅在返回的时候特殊处理 (4.3.0 更改为 HTTP)
- final String selfDefaultAddress = transportService.defaultProtocol().getAddress();
- appInfo.setCurrentServer(selfDefaultAddress);
- appInfo.setGmtModified(new Date());
+ // 篡位,如果本机存在协议,则作为Server调度该 worker
+ final ProtocolInfo targetProtocolInfo = transportService.allProtocols().get(protocol);
+ if (targetProtocolInfo != null) {
+ // 注意,写入 AppInfoDO#currentServer 的永远是 default 的地址,仅在返回的时候特殊处理为协议地址
+ appInfo.setCurrentServer(transportService.defaultProtocol().getAddress());
+ appInfo.setGmtModified(new Date());
- appInfoRepository.saveAndFlush(appInfo);
- log.info("[ServerElection] this server({}) become the new server for app(appId={}).", appInfo.getCurrentServer(), appId);
- return selfDefaultAddress;
+ appInfoRepository.saveAndFlush(appInfo);
+ log.info("[ServerElection] this server({}) become the new server for app(appId={}).", appInfo.getCurrentServer(), appId);
+ return targetProtocolInfo.getAddress();
+ }
}catch (Exception e) {
log.error("[ServerElection] write new server to db failed for app {}.", appName, e);
}finally {
@@ -142,10 +151,14 @@ public class ServerElectionService {
if (response.isSuccess()) {
log.info("[ServerElection] server[{}] is active, it will be the master.", serverAddress);
downServerCache.remove(serverAddress);
- return serverAddress;
+ // 检测通过的是远程 server 的暴露地址,需要返回 worker 需要的协议地址
+ final JSONObject protocolInfo = JsonUtils.parseObject(response.getData(), JSONObject.class).getJSONObject(protocol);
+ if (protocolInfo != null) {
+ return protocolInfo.toJavaObject(ProtocolInfo.class).getAddress();
+ }
}
}catch (Exception e) {
- log.warn("[ServerElection] server[{}] was down.", serverAddress);
+ log.warn("[ServerElection] server[{}] was down.", serverAddress, e);
}
downServerCache.add(serverAddress);
return null;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
index 1f178dde..ad906487 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java
@@ -86,7 +86,7 @@ public class DesignateServerAspect {
}
// 目标IP与本地符合则本地执行
- if (Objects.equals(targetServer, transportService.defaultProtocol())) {
+ if (Objects.equals(targetServer, transportService.defaultProtocol().getAddress())) {
return point.proceed();
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java
index e620d2df..0802e811 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/ProtocolInfo.java
@@ -1,6 +1,7 @@
package tech.powerjob.server.remote.transporter;
import lombok.Getter;
+import lombok.Setter;
import lombok.ToString;
import tech.powerjob.remote.framework.transporter.Transporter;
@@ -11,14 +12,15 @@ import tech.powerjob.remote.framework.transporter.Transporter;
* @since 2023/1/21
*/
@Getter
+@Setter
@ToString
public class ProtocolInfo {
- private final String protocol;
+ private String protocol;
- private final String address;
+ private String address;
- private final transient Transporter transporter;
+ private transient Transporter transporter;
public ProtocolInfo(String protocol, String address, Transporter transporter) {
this.protocol = protocol;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java
index 3124aa27..97e390e3 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/TransportService.java
@@ -4,6 +4,7 @@ import tech.powerjob.common.PowerSerializable;
import tech.powerjob.remote.framework.base.RemotingException;
import tech.powerjob.remote.framework.base.URL;
+import java.util.Map;
import java.util.concurrent.CompletionStage;
/**
@@ -22,6 +23,12 @@ public interface TransportService {
*/
ProtocolInfo defaultProtocol();
+ /**
+ * 当前支持的全部协议
+ * @return allProtocols
+ */
+ Map allProtocols();
+
void tell(String protocol, URL url, PowerSerializable request);
CompletionStage ask(String protocol, URL url, PowerSerializable request, Class clz) throws RemotingException;
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
index 26dad376..4dd39a75 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
@@ -50,7 +50,7 @@ public class PowerTransportService implements TransportService, InitializingBean
private final Environment environment;
private ProtocolInfo defaultProtocol;
- private final Map protocol2Transporter = Maps.newHashMap();
+ private final Map protocolName2Info = Maps.newHashMap();
private final List engines = Lists.newArrayList();
@@ -65,10 +65,15 @@ public class PowerTransportService implements TransportService, InitializingBean
return defaultProtocol;
}
+ @Override
+ public Map allProtocols() {
+ return protocolName2Info;
+ }
+
private ProtocolInfo fetchProtocolInfo(String protocol) {
// 兼容老版 worker 未上报 protocol 的情况
protocol = compatibleProtocol(protocol);
- final ProtocolInfo protocolInfo = protocol2Transporter.get(protocol);
+ final ProtocolInfo protocolInfo = protocolName2Info.get(protocol);
if (protocolInfo == null) {
throw new IllegalArgumentException("can't find Transporter by protocol :" + protocol);
}
@@ -105,7 +110,7 @@ public class PowerTransportService implements TransportService, InitializingBean
log.info("[PowerTransportService] start RemoteEngine[type={},address={}] successfully", protocol, address);
this.engines.add(re);
- this.protocol2Transporter.put(protocol, new ProtocolInfo(protocol, address.toFullAddress(), engineOutput.getTransporter()));
+ this.protocolName2Info.put(protocol, new ProtocolInfo(protocol, address.toFullAddress(), engineOutput.getTransporter()));
}
@Override
@@ -131,7 +136,7 @@ public class PowerTransportService implements TransportService, InitializingBean
choseDefault();
log.info("[PowerTransportService] initialize successfully!");
- log.info("[PowerTransportService] ALL_PROTOCOLS: {}", protocol2Transporter);
+ log.info("[PowerTransportService] ALL_PROTOCOLS: {}", protocolName2Info);
}
/**
@@ -165,7 +170,7 @@ public class PowerTransportService implements TransportService, InitializingBean
* HTTP 优先,否则默认取第一个协议
*/
private void choseDefault() {
- ProtocolInfo httpP = protocol2Transporter.get(Protocol.HTTP.name());
+ ProtocolInfo httpP = protocolName2Info.get(Protocol.HTTP.name());
if (httpP != null) {
log.info("[PowerTransportService] exist HTTP protocol, chose this as the default protocol!");
this.defaultProtocol = httpP;
@@ -173,7 +178,7 @@ public class PowerTransportService implements TransportService, InitializingBean
}
String firstProtocol = activeProtocols.split(OmsConstant.COMMA)[0];
- this.defaultProtocol = this.protocol2Transporter.get(firstProtocol);
+ this.defaultProtocol = this.protocolName2Info.get(firstProtocol);
log.info("[PowerTransportService] chose [{}] as the default protocol!", firstProtocol);
if (this.defaultProtocol == null) {
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
index 1565cdb0..5617a6c6 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
@@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import tech.powerjob.common.request.ServerDiscoveryRequest;
import tech.powerjob.common.response.ResultDTO;
import tech.powerjob.common.utils.CommonUtils;
import tech.powerjob.common.utils.NetUtils;
@@ -47,8 +48,8 @@ public class ServerController {
}
@GetMapping("/acquire")
- public ResultDTO acquireServer(Long appId, String protocol, String currentServer) {
- return ResultDTO.success(serverElectionService.elect(appId, protocol, currentServer));
+ public ResultDTO acquireServer(ServerDiscoveryRequest request) {
+ return ResultDTO.success(serverElectionService.elect(request));
}
@GetMapping("/hello")
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/background/ServerDiscoveryService.java b/powerjob-worker/src/main/java/tech/powerjob/worker/background/ServerDiscoveryService.java
index 89f07874..e7e1752c 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/background/ServerDiscoveryService.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/background/ServerDiscoveryService.java
@@ -1,9 +1,12 @@
package tech.powerjob.worker.background;
+import com.google.common.base.Joiner;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import tech.powerjob.common.OmsConstant;
import tech.powerjob.common.exception.PowerJobException;
+import tech.powerjob.common.request.ServerDiscoveryRequest;
import tech.powerjob.common.response.ResultDTO;
import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.common.utils.CollectionUtils;
@@ -37,7 +40,7 @@ public class ServerDiscoveryService {
/**
* 服务发现地址
*/
- private static final String DISCOVERY_URL = "http://%s/server/acquire?appId=%d¤tServer=%s&protocol=AKKA";
+ private static final String DISCOVERY_URL = "http://%s/server/acquire?%s";
/**
* 失败次数
*/
@@ -131,7 +134,7 @@ public class ServerDiscoveryService {
@SuppressWarnings("rawtypes")
private String acquire(String httpServerAddress) {
String result = null;
- String url = String.format(DISCOVERY_URL, httpServerAddress, appId, currentServerAddress);
+ String url = buildServerDiscoveryUrl(httpServerAddress);
try {
result = CommonUtils.executeWithRetry0(() -> HttpUtils.get(url));
}catch (Exception ignore) {
@@ -147,4 +150,15 @@ public class ServerDiscoveryService {
}
return null;
}
+
+ private String buildServerDiscoveryUrl(String address) {
+
+ ServerDiscoveryRequest serverDiscoveryRequest = new ServerDiscoveryRequest()
+ .setAppId(appId)
+ .setCurrentServer(currentServerAddress)
+ .setProtocol(config.getProtocol().name().toUpperCase());
+
+ String query = Joiner.on(OmsConstant.AND).withKeyValueSeparator(OmsConstant.EQUAL).join(serverDiscoveryRequest.toMap());
+ return String.format(DISCOVERY_URL, address, query);
+ }
}
From 4a41e322ab99fe701c2b5fbf3c0a5746603f1f83 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 00:37:09 +0800
Subject: [PATCH 068/100] fix: server elect bug
---
.../server/remote/server/election/ServerElectionService.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
index 37eb4639..1a9f8a21 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
@@ -117,7 +117,7 @@ public class ServerElectionService {
}
}catch (Exception e) {
log.error("[ServerElection] write new server to db failed for app {}.", appName, e);
- }finally {
+ } finally {
lockService.unlock(lockName);
}
}
@@ -150,10 +150,10 @@ public class ServerElectionService {
.get(PING_TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (response.isSuccess()) {
log.info("[ServerElection] server[{}] is active, it will be the master.", serverAddress);
- downServerCache.remove(serverAddress);
// 检测通过的是远程 server 的暴露地址,需要返回 worker 需要的协议地址
final JSONObject protocolInfo = JsonUtils.parseObject(response.getData(), JSONObject.class).getJSONObject(protocol);
if (protocolInfo != null) {
+ downServerCache.remove(serverAddress);
return protocolInfo.toJavaObject(ProtocolInfo.class).getAddress();
}
}
From 17b842a2a21ad084ecbef4f51671d3c61164d582 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 00:40:14 +0800
Subject: [PATCH 069/100] fix: server elect bug
---
.../powerjob/common/serialize/JsonUtils.java | 20 +++++++++----------
.../server/remote/server/FriendActor.java | 3 +--
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java b/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java
index ee40566a..77ca831c 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/serialize/JsonUtils.java
@@ -20,7 +20,7 @@ import java.io.IOException;
@Slf4j
public class JsonUtils {
- private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder()
+ private static final JsonMapper JSON_MAPPER = JsonMapper.builder()
.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
.configure(JsonParser.Feature.IGNORE_UNDEFINED, true)
@@ -32,7 +32,7 @@ public class JsonUtils {
public static String toJSONString(Object obj) {
try {
- return OBJECT_MAPPER.writeValueAsString(obj);
+ return JSON_MAPPER.writeValueAsString(obj);
}catch (Exception e) {
log.error("[PowerJob] toJSONString failed", e);
}
@@ -41,7 +41,7 @@ public class JsonUtils {
public static String toJSONStringUnsafe(Object obj) {
try {
- return OBJECT_MAPPER.writeValueAsString(obj);
+ return JSON_MAPPER.writeValueAsString(obj);
}catch (Exception e) {
throw new PowerJobException(e);
}
@@ -49,7 +49,7 @@ public class JsonUtils {
public static byte[] toBytes(Object obj) {
try {
- return OBJECT_MAPPER.writeValueAsBytes(obj);
+ return JSON_MAPPER.writeValueAsBytes(obj);
}catch (Exception e) {
log.error("[PowerJob] serialize failed", e);
}
@@ -57,24 +57,24 @@ public class JsonUtils {
}
public static T parseObject(String json, Class clz) throws JsonProcessingException {
- return OBJECT_MAPPER.readValue(json, clz);
+ return JSON_MAPPER.readValue(json, clz);
}
public static T parseObject(byte[] b, Class clz) throws IOException {
- return OBJECT_MAPPER.readValue(b, clz);
+ return JSON_MAPPER.readValue(b, clz);
}
public static T parseObject(byte[] b, TypeReference typeReference) throws IOException {
- return OBJECT_MAPPER.readValue(b, typeReference);
+ return JSON_MAPPER.readValue(b, typeReference);
}
public static T parseObject(String json, TypeReference typeReference) throws IOException {
- return OBJECT_MAPPER.readValue(json, typeReference);
+ return JSON_MAPPER.readValue(json, typeReference);
}
public static T parseObjectIgnoreException(String json, Class clz) {
try {
- return OBJECT_MAPPER.readValue(json, clz);
+ return JSON_MAPPER.readValue(json, clz);
}catch (Exception e) {
log.error("unable to parse json string to object,current string:{}",json,e);
return null;
@@ -84,7 +84,7 @@ public class JsonUtils {
public static T parseObjectUnsafe(String json, Class clz) {
try {
- return OBJECT_MAPPER.readValue(json, clz);
+ return JSON_MAPPER.readValue(json, clz);
}catch (Exception e) {
ExceptionUtils.rethrow(e);
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
index 0b5a848f..8d7d56e3 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java
@@ -37,8 +37,7 @@ public class FriendActor {
*/
@Handler(path = S4S_HANDLER_PING, processType = ProcessType.NO_BLOCKING)
public AskResponse onReceivePing(Ping ping) {
- final AskResponse response = AskResponse.succeed(transportService.allProtocols());
- return response;
+ return AskResponse.succeed(transportService.allProtocols());
}
@Handler(path = S4S_HANDLER_PROCESS, processType = ProcessType.BLOCKING)
From 63a5e2b4583636a6bb66e43cc65a0ff6159fa396 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 10:36:22 +0800
Subject: [PATCH 070/100] feat: optimize ServerElectionService
---
.../server/election/ServerElectionService.java | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
index 1a9f8a21..5b0eb819 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/election/ServerElectionService.java
@@ -56,10 +56,12 @@ public class ServerElectionService {
public String elect(ServerDiscoveryRequest request) {
if (!accurate()) {
+ final String currentServer = request.getCurrentServer();
// 如果是本机,就不需要查数据库那么复杂的操作了,直接返回成功
Optional localProtocolInfoOpt = Optional.ofNullable(transportService.allProtocols().get(request.getProtocol()));
- if (localProtocolInfoOpt.isPresent() && localProtocolInfoOpt.get().getAddress().equals(request.getCurrentServer())) {
- return request.getCurrentServer();
+ if (localProtocolInfoOpt.isPresent() && localProtocolInfoOpt.get().getAddress().equals(currentServer)) {
+ log.debug("[ServerElectionService] this server[{}] is worker's current server, skip check", currentServer);
+ return currentServer;
}
}
return getServer0(request);
@@ -149,12 +151,15 @@ public class ServerElectionService {
.toCompletableFuture()
.get(PING_TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (response.isSuccess()) {
- log.info("[ServerElection] server[{}] is active, it will be the master.", serverAddress);
// 检测通过的是远程 server 的暴露地址,需要返回 worker 需要的协议地址
final JSONObject protocolInfo = JsonUtils.parseObject(response.getData(), JSONObject.class).getJSONObject(protocol);
if (protocolInfo != null) {
downServerCache.remove(serverAddress);
- return protocolInfo.toJavaObject(ProtocolInfo.class).getAddress();
+ final String protocolAddress = protocolInfo.toJavaObject(ProtocolInfo.class).getAddress();
+ log.info("[ServerElection] server[{}] is active, it will be the master, final protocol address={}", serverAddress, protocolAddress);
+ return protocolAddress;
+ } else {
+ log.warn("[ServerElection] server[{}] is active but don't have target protocol", serverAddress);
}
}
}catch (Exception e) {
From dca97010c71426aab0b44e03b2ff565a7d2c8ea7 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 10:52:53 +0800
Subject: [PATCH 071/100] fix: server return Optional to worker
---
.../core/handler/AbWorkerRequestHandler.java | 6 +++---
.../core/handler/IWorkerRequestHandler.java | 4 +---
.../handler/WorkerRequestHandlerImpl.java | 9 ++++-----
.../impl/PowerTransportService.java | 19 ++++++++++---------
.../src/main/resources/application.properties | 4 ++--
.../impl/BuiltInSpringProcessorFactory.java | 2 +-
6 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java
index c13c4cf6..90c0e59e 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/AbWorkerRequestHandler.java
@@ -53,7 +53,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
protected abstract void processWorkerHeartbeat0(WorkerHeartbeat heartbeat, WorkerHeartbeatEvent event);
- protected abstract Optional processTaskTrackerReportInstanceStatus0(TaskTrackerReportInstanceStatusReq req, TtReportInstanceStatusEvent event) throws Exception;
+ protected abstract AskResponse processTaskTrackerReportInstanceStatus0(TaskTrackerReportInstanceStatusReq req, TtReportInstanceStatusEvent event) throws Exception;
protected abstract void processWorkerLogReport0(WorkerLogReportReq req, WorkerLogReportEvent event);
@@ -77,7 +77,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
@Override
@Handler(path = S4W_HANDLER_REPORT_INSTANCE_STATUS, processType = ProcessType.BLOCKING)
- public Optional processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req) {
+ public AskResponse processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req) {
long startMs = System.currentTimeMillis();
TtReportInstanceStatusEvent event = new TtReportInstanceStatusEvent()
.setAppId(req.getAppId())
@@ -92,7 +92,7 @@ public abstract class AbWorkerRequestHandler implements IWorkerRequestHandler {
} catch (Exception e) {
event.setServerProcessStatus(TtReportInstanceStatusEvent.Status.FAILED);
log.error("[WorkerRequestHandler] processTaskTrackerReportInstanceStatus failed for request: {}", req, e);
- return Optional.of(AskResponse.failed(ExceptionUtils.getMessage(e)));
+ return AskResponse.failed(ExceptionUtils.getMessage(e));
} finally {
event.setServerProcessCost(System.currentTimeMillis() - startMs);
monitorService.monitor(event);
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
index e55c1903..7b11ded6 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/IWorkerRequestHandler.java
@@ -3,8 +3,6 @@ package tech.powerjob.server.core.handler;
import tech.powerjob.common.request.*;
import tech.powerjob.common.response.AskResponse;
-import java.util.Optional;
-
/**
* 定义 server 与 worker 之间需要处理的协议
*
@@ -24,7 +22,7 @@ public interface IWorkerRequestHandler {
* @param req 上报请求
* @return 响应信息
*/
- Optional processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req);
+ AskResponse processTaskTrackerReportInstanceStatus(TaskTrackerReportInstanceStatusReq req);
/**
* 处理 worker 查询执行器集群
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java
index 13eef738..129571e0 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandlerImpl.java
@@ -22,8 +22,6 @@ import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepositor
import tech.powerjob.server.remote.worker.WorkerClusterManagerService;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
-import java.util.Optional;
-
/**
* receive and process worker's request
*
@@ -55,7 +53,7 @@ public class WorkerRequestHandlerImpl extends AbWorkerRequestHandler {
}
@Override
- protected Optional processTaskTrackerReportInstanceStatus0(TaskTrackerReportInstanceStatusReq req, TtReportInstanceStatusEvent event) throws Exception {
+ protected AskResponse processTaskTrackerReportInstanceStatus0(TaskTrackerReportInstanceStatusReq req, TtReportInstanceStatusEvent event) throws Exception {
// 2021/02/05 如果是工作流中的实例先尝试更新上下文信息,再更新实例状态,这里一定不会有异常
if (req.getWfInstanceId() != null && !CollectionUtils.isEmpty(req.getAppendedWfContext())) {
// 更新工作流上下文信息
@@ -66,9 +64,10 @@ public class WorkerRequestHandlerImpl extends AbWorkerRequestHandler {
// 结束状态(成功/失败)需要回复消息
if (InstanceStatus.FINISHED_STATUS.contains(req.getInstanceStatus())) {
- return Optional.of(AskResponse.succeed(null));
+ return AskResponse.succeed(null);
}
- return Optional.empty();
+
+ return null;
}
@Override
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
index 4dd39a75..3e649baa 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
@@ -45,6 +45,13 @@ public class PowerTransportService implements TransportService, InitializingBean
@Value("${oms.transporter.active.protocols}")
private String activeProtocols;
+
+ /**
+ * 主要通讯协议,用于 server 与 server 之间的通讯,用户必须保证该协议可用!
+ */
+ @Value("${oms.transporter.main.protocol}")
+ private String mainProtocol;
+
private static final String PROTOCOL_PORT_CONFIG = "oms.%s.port";
private final Environment environment;
@@ -170,16 +177,10 @@ public class PowerTransportService implements TransportService, InitializingBean
* HTTP 优先,否则默认取第一个协议
*/
private void choseDefault() {
- ProtocolInfo httpP = protocolName2Info.get(Protocol.HTTP.name());
- if (httpP != null) {
- log.info("[PowerTransportService] exist HTTP protocol, chose this as the default protocol!");
- this.defaultProtocol = httpP;
- return;
- }
- String firstProtocol = activeProtocols.split(OmsConstant.COMMA)[0];
- this.defaultProtocol = this.protocolName2Info.get(firstProtocol);
- log.info("[PowerTransportService] chose [{}] as the default protocol!", firstProtocol);
+
+ this.defaultProtocol = this.protocolName2Info.get(mainProtocol);
+ log.info("[PowerTransportService] chose [{}] as the default protocol, make sure this protocol can work!", mainProtocol);
if (this.defaultProtocol == null) {
throw new IllegalArgumentException("can't find default protocol, please check your config!");
diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/application.properties b/powerjob-server/powerjob-server-starter/src/main/resources/application.properties
index 72fd1ec8..f8cce8b8 100644
--- a/powerjob-server/powerjob-server-starter/src/main/resources/application.properties
+++ b/powerjob-server/powerjob-server-starter/src/main/resources/application.properties
@@ -16,9 +16,9 @@ spring.servlet.multipart.max-request-size=209715200
# temporary skip circular references check
spring.main.allow-circular-references=true
-###### PowerJob self-owned configuration (The following properties should exist in application.properties only). ######
-# Akka ActorSystem port.
+###### PowerJob transporter configuration ######
oms.transporter.active.protocols=AKKA,HTTP
+oms.transporter.main.protocol=HTTP
oms.akka.port=10086
oms.http.port=10010
# Prefix for all tables. Default empty string. Config if you have needs, i.e. pj_
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/processor/impl/BuiltInSpringProcessorFactory.java b/powerjob-worker/src/main/java/tech/powerjob/worker/processor/impl/BuiltInSpringProcessorFactory.java
index 2ac5b0fb..e93afe27 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/processor/impl/BuiltInSpringProcessorFactory.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/processor/impl/BuiltInSpringProcessorFactory.java
@@ -46,7 +46,7 @@ public class BuiltInSpringProcessorFactory implements ProcessorFactory {
.setProcessor(basicProcessor)
.setClassLoader(basicProcessor.getClass().getClassLoader());
} catch (Throwable t) {
- log.warn("[ProcessorFactory] load by BuiltInSpringProcessorFactory failed!", t);
+ log.warn("[ProcessorFactory] load by BuiltInSpringProcessorFactory failed. If you are using Spring, make sure this bean was managed by Spring", t);
}
return null;
From 5b78204beb4a27bcaec85d51eb2e31affb8563b2 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 11:04:28 +0800
Subject: [PATCH 072/100] chore: optimize pom config
---
powerjob-worker-agent/pom.xml | 8 ++++++++
powerjob-worker/pom.xml | 21 +++++++++++++++------
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/powerjob-worker-agent/pom.xml b/powerjob-worker-agent/pom.xml
index 7449eabc..847e4a50 100644
--- a/powerjob-worker-agent/pom.xml
+++ b/powerjob-worker-agent/pom.xml
@@ -18,6 +18,7 @@
4.2.1
1.2.9
4.3.2
+ 5.3.23
2.3.4.RELEASE
@@ -98,6 +99,13 @@
postgresql
${postgresql.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
diff --git a/powerjob-worker/pom.xml b/powerjob-worker/pom.xml
index 045254d5..a2ad24d9 100644
--- a/powerjob-worker/pom.xml
+++ b/powerjob-worker/pom.xml
@@ -21,6 +21,7 @@
1.2.9
+ 4.2.1
4.2.1
4.2.1
4.2.1
@@ -28,12 +29,11 @@
-
+
- org.springframework
- spring-context
- ${spring.version}
- provided
+ tech.powerjob
+ powerjob-common
+ ${powerjob-common.version}
@@ -44,12 +44,13 @@
+
tech.powerjob
powerjob-remote-impl-akka
${powerjob-remote-impl-akka.version}
-
+
tech.powerjob
powerjob-remote-impl-http
@@ -70,6 +71,14 @@
${hikaricp.version}
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+ provided
+
+
org.junit.jupiter
From 789bcb5d10cb2a3c884361663929c5791393e00e Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 11:15:11 +0800
Subject: [PATCH 073/100] chore: worker http support
---
.../engine/impl/CSInitializerFactory.java | 2 +-
.../src/main/resources/oms-server.akka.conf | 68 -------------------
.../src/main/resources/application.properties | 2 +
powerjob-worker/pom.xml | 6 +-
4 files changed, 5 insertions(+), 73 deletions(-)
delete mode 100644 powerjob-server/powerjob-server-starter/src/main/resources/oms-server.akka.conf
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java
index eb1452d0..8b02f3d4 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/CSInitializerFactory.java
@@ -39,6 +39,6 @@ class CSInitializerFactory {
}
}
- throw new PowerJobException(String.format("can't load CSInitializer[%s], ensure your package name start with 'tech.powerjob'!", targetType));
+ throw new PowerJobException(String.format("can't load CSInitializer[%s], ensure your package name start with 'tech.powerjob' and import the dependencies!", targetType));
}
}
diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/oms-server.akka.conf b/powerjob-server/powerjob-server-starter/src/main/resources/oms-server.akka.conf
deleted file mode 100644
index 95afe889..00000000
--- a/powerjob-server/powerjob-server-starter/src/main/resources/oms-server.akka.conf
+++ /dev/null
@@ -1,68 +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 = 0
- }
- }
-
- # worker-request-core-dispatcher
- w-r-c-d {
- # 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 = 128
- }
- # 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
- }
-
- friend-request-actor-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 = 128
- }
- # 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 = 5
- }
-}
\ No newline at end of file
diff --git a/powerjob-worker-samples/src/main/resources/application.properties b/powerjob-worker-samples/src/main/resources/application.properties
index 838e6ce3..c1760d8b 100644
--- a/powerjob-worker-samples/src/main/resources/application.properties
+++ b/powerjob-worker-samples/src/main/resources/application.properties
@@ -9,6 +9,8 @@ powerjob.worker.akka-port=27777
powerjob.worker.app-name=powerjob-worker-samples
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
+# transport protocol between server and worker
+powerjob.worker.protocol=http
# Store strategy of H2 database. disk or memory. Default value is disk.
powerjob.worker.store-strategy=disk
# Max length of result. Results that are longer than the value will be truncated.
diff --git a/powerjob-worker/pom.xml b/powerjob-worker/pom.xml
index a2ad24d9..c83b6583 100644
--- a/powerjob-worker/pom.xml
+++ b/powerjob-worker/pom.xml
@@ -43,19 +43,17 @@
${powerjob-remote-framework.version}
-
-
+
+
tech.powerjob
powerjob-remote-impl-akka
${powerjob-remote-impl-akka.version}
-
tech.powerjob
powerjob-remote-impl-http
${powerjob-remote-impl-http.version}
- provided
From afdf4a7dc213d6bb6143411085042a8c0314a830 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 16:38:05 +0800
Subject: [PATCH 074/100] feat: worker starter use new port config name
---
.../src/main/resources/application.properties | 4 ++--
.../autoconfigure/PowerJobAutoConfiguration.java | 12 ++++++++----
.../worker/autoconfigure/PowerJobProperties.java | 6 ++++++
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/powerjob-worker-samples/src/main/resources/application.properties b/powerjob-worker-samples/src/main/resources/application.properties
index c1760d8b..c7249888 100644
--- a/powerjob-worker-samples/src/main/resources/application.properties
+++ b/powerjob-worker-samples/src/main/resources/application.properties
@@ -3,8 +3,8 @@ spring.jpa.open-in-view=false
########### PowerJob-worker properties. ###########
# Whether to enable PowerJob Worker, default is true
powerjob.worker.enabled=true
-# Akka port, default is 27777
-powerjob.worker.akka-port=27777
+# Transport port, default is 27777
+powerjob.worker.port=27777
# Application name, used for grouping applications. Recommend to set the same value as project name.
powerjob.worker.app-name=powerjob-worker-samples
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
diff --git a/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobAutoConfiguration.java b/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobAutoConfiguration.java
index 906345da..77da03f3 100644
--- a/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobAutoConfiguration.java
+++ b/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobAutoConfiguration.java
@@ -46,11 +46,15 @@ public class PowerJobAutoConfiguration {
/*
* Configuration of worker port. Random port is enabled when port is set with non-positive number.
*/
- int port = worker.getAkkaPort();
- if (port <= 0) {
- port = NetUtils.getRandomPort();
+ if (worker.getPort() != null) {
+ config.setPort(worker.getPort());
+ } else {
+ int port = worker.getAkkaPort();
+ if (port <= 0) {
+ port = NetUtils.getRandomPort();
+ }
+ config.setPort(port);
}
- config.setPort(port);
/*
* appName, name of the application. Applications should be registered in advance to prevent
* error. This property should be the same with what you entered for appName when getting
diff --git a/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobProperties.java b/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobProperties.java
index cdfe068d..5ac4181e 100644
--- a/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobProperties.java
+++ b/powerjob-worker-spring-boot-starter/src/main/java/tech/powerjob/worker/autoconfigure/PowerJobProperties.java
@@ -112,8 +112,14 @@ public class PowerJobProperties {
/**
* Akka port of Powerjob-worker, optional value. Default value of this property is 27777.
* If multiple PowerJob-worker nodes were deployed, different, unique ports should be assigned.
+ * Deprecated, please use 'port'
*/
+ @Deprecated
private int akkaPort = RemoteConstant.DEFAULT_WORKER_PORT;
+ /**
+ * port
+ */
+ private Integer port;
/**
* Address(es) of Powerjob-server node(s). Ip:port or domain.
* Example of single Powerjob-server node:
From dc61bb4648d569ae43fcd05886ad1ab84831529e Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 17:11:56 +0800
Subject: [PATCH 075/100] fix: JavaUtils cache failed in windows env
---
.../src/main/java/tech/powerjob/common/utils/JavaUtils.java | 3 ++-
.../java/tech/powerjob/remote/akka/AkkaMappingService.java | 3 +++
.../src/main/resources/application.properties | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/utils/JavaUtils.java b/powerjob-common/src/main/java/tech/powerjob/common/utils/JavaUtils.java
index f4ffd088..efff1973 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/utils/JavaUtils.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/utils/JavaUtils.java
@@ -53,8 +53,9 @@ public class JavaUtils {
}
catch (Throwable t) {
log.warn("[JavaUtils] determinePackageVersion for clz[{}] failed, msg: {}", clz.getSimpleName(), t.toString());
+ // windows 下无权限访问会一直报错一直重试,需要在此兼容
+ return "UNKNOWN";
}
- return null;
}
private static String getImplementationVersion(JarFile jarFile) throws IOException {
return jarFile.getManifest().getMainAttributes().getValue(Attributes.Name.IMPLEMENTATION_VERSION);
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java
index ac4392d6..afe1f3af 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaMappingService.java
@@ -24,6 +24,9 @@ public class AkkaMappingService {
static {
addMappingRule(RemoteConstant.S4W_PATH, "server_actor", "w-r-c-d");
addMappingRule(RemoteConstant.S4S_PATH, "friend_actor", "friend-request-actor-dispatcher");
+
+ addMappingRule(RemoteConstant.WTT_PATH, "task_tracker", "task-tracker-dispatcher");
+ addMappingRule(RemoteConstant.WPT_PATH, "processor_tracker", "processor-tracker-dispatcher");
}
private static final String DEFAULT_DISPATCH_NAME = "common-dispatcher";
diff --git a/powerjob-worker-samples/src/main/resources/application.properties b/powerjob-worker-samples/src/main/resources/application.properties
index c7249888..f2f6e1b0 100644
--- a/powerjob-worker-samples/src/main/resources/application.properties
+++ b/powerjob-worker-samples/src/main/resources/application.properties
@@ -10,7 +10,7 @@ powerjob.worker.app-name=powerjob-worker-samples
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
# transport protocol between server and worker
-powerjob.worker.protocol=http
+powerjob.worker.protocol=akka
# Store strategy of H2 database. disk or memory. Default value is disk.
powerjob.worker.store-strategy=disk
# Max length of result. Results that are longer than the value will be truncated.
From 6c21c7864ae2521ec0b3085852c0caa061a8b49c Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 17:22:24 +0800
Subject: [PATCH 076/100] feat: add jaxb-api to samples project to support JDK
---
powerjob-worker-samples/pom.xml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/powerjob-worker-samples/pom.xml b/powerjob-worker-samples/pom.xml
index 091c275e..8b5ef3c6 100644
--- a/powerjob-worker-samples/pom.xml
+++ b/powerjob-worker-samples/pom.xml
@@ -59,6 +59,13 @@
${powerjob.official.processors.version}
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.1
+
+
From b8199bf0360283c4020eec97b0b1c5bef968aa24 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 17:37:03 +0800
Subject: [PATCH 077/100] feat: optimize demo project
---
.../samples/PowerJobWorkerConfig.java | 41 -----------------
.../samples/PowerJobWorkerInitializer.java | 44 +++++++++++++++++++
2 files changed, 44 insertions(+), 41 deletions(-)
delete mode 100644 powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerConfig.java
create mode 100644 powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerInitializer.java
diff --git a/powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerConfig.java b/powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerConfig.java
deleted file mode 100644
index 7ec8672b..00000000
--- a/powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerConfig.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package tech.powerjob.samples;
-
-import org.springframework.context.annotation.Configuration;
-
-/**
- * powerjob-worker 配置
- * 代码配置示例,SpringBoot 项目支持使用 starter,只需要在 application.properties 中完成配置即可
- *
- * @author tjq
- * @since 2020/4/17
- */
-@Configuration
-public class PowerJobWorkerConfig {
-
- /*
-
- @Bean(name = "worker2")
- public OhMyWorker initOMS() throws Exception {
-
- // 服务器HTTP地址(端口号为 server.port,而不是 ActorSystem port)
- List serverAddress = Lists.newArrayList("127.0.0.1:7700", "127.0.0.1:7701");
-
- // 1. 创建配置文件
- OhMyConfig config = new OhMyConfig();
- config.setPort(28888);
- config.setAppName("powerjob-multi-worker-2");
- config.setServerAddress(serverAddress);
- // 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算
- config.setStoreStrategy(StoreStrategy.DISK);
-
- // 2. 创建 Worker 对象,设置配置文件
- OhMyWorker ohMyWorker = new OhMyWorker();
- ohMyWorker.setConfig(config);
- return ohMyWorker;
- }
-
-
- */
-
-
-}
diff --git a/powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerInitializer.java b/powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerInitializer.java
new file mode 100644
index 00000000..e6150ee2
--- /dev/null
+++ b/powerjob-worker-samples/src/main/java/tech/powerjob/samples/PowerJobWorkerInitializer.java
@@ -0,0 +1,44 @@
+package tech.powerjob.samples;
+
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * powerjob-worker 配置
+ * 代码配置示例,SpringBoot 项目支持使用 starter,只需要在 application.properties 中完成配置即可
+ *
+ * @author tjq
+ * @since 2020/4/17
+ */
+@Configuration
+public class PowerJobWorkerInitializer {
+
+ /*
+ 手动配置版代码
+ 常规 SpringBoot 用户直接使用 starter 配置即可,具体配置见 application.properties
+
+ @Bean
+ public PowerJobSpringWorker initPowerJobSpringWorkerByCode() {
+
+ // 初始化 PowerJob 配置文件
+ PowerJobWorkerConfig config = new PowerJobWorkerConfig();
+ // 传输协议,新用户建议直接上 HTTP
+ config.setProtocol(Protocol.HTTP);
+ // 传输层端口号
+ config.setPort(28888);
+ // worker 的归组,建议使用项目名称
+ config.setAppName("powerjob-multi-worker-2");
+ // server 的服务发现地址,支持多IP 或 HTTP 域名
+ config.setServerAddress(Lists.newArrayList("127.0.0.1:7700", "127.0.0.1:7701"));
+ // 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算
+ config.setStoreStrategy(StoreStrategy.DISK);
+ // 执行器的自定义标签,可用于指定部分执行器运行。举例:多单元机房将 TAG 设置为单元名称,即可在控制台指定单元运行
+ config.setTag("CENTER");
+
+ // 以上为核心配置,其他配置可直接参考注释 or 官方文档
+
+ // 注意 Spring 用户请使用 PowerJobSpringWorker 而不是 PowerJobWorker,后者无法使用 Spring 管理的 Bean 作为执行器
+ return new PowerJobSpringWorker(config);
+ }
+
+ */
+}
From 8e94976cddfef2ff774c805ace9973cf38ea1b92 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sun, 22 Jan 2023 17:50:29 +0800
Subject: [PATCH 078/100] feat: allowed user to customize the storage path of
the h2 database #521
---
.../tech/powerjob/common/PowerJobDKey.java | 2 ++
.../impl/script/AbstractScriptProcessor.java | 3 +-
.../worker/common/utils/PowerFileUtils.java | 30 +++++++++++++++++++
.../worker/container/OmsContainerFactory.java | 5 ++--
.../worker/persistence/ConnectionFactory.java | 3 +-
5 files changed, 39 insertions(+), 4 deletions(-)
create mode 100644 powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/PowerFileUtils.java
diff --git a/powerjob-common/src/main/java/tech/powerjob/common/PowerJobDKey.java b/powerjob-common/src/main/java/tech/powerjob/common/PowerJobDKey.java
index 45485189..aa27ea48 100644
--- a/powerjob-common/src/main/java/tech/powerjob/common/PowerJobDKey.java
+++ b/powerjob-common/src/main/java/tech/powerjob/common/PowerJobDKey.java
@@ -41,6 +41,8 @@ public class PowerJobDKey {
* It's VERY dangerous
*/
public static final String WORKER_ALLOWED_FORCE_STOP_THREAD = "powerjob.worker.allowed-force-stop-thread";
+
+ public static final String WORKER_WORK_SPACE = "powerjob.worker.workspace";
/**
* ms
*/
diff --git a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java
index 935df2ca..768160e2 100644
--- a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java
+++ b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java
@@ -1,5 +1,6 @@
package tech.powerjob.official.processors.impl.script;
+import tech.powerjob.worker.common.utils.PowerFileUtils;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.log.OmsLogger;
@@ -34,7 +35,7 @@ public abstract class AbstractScriptProcessor extends CommonBasicProcessor {
protected static final String SH_SHELL = "/bin/sh";
protected static final String CMD_SHELL = "cmd.exe";
- private static final String WORKER_DIR = System.getProperty("user.home") + "/powerjob/worker/official_script_processor/";
+ private static final String WORKER_DIR = PowerFileUtils.workspace() + "/official_script_processor/";
@Override
protected ProcessResult process0(TaskContext context) throws Exception {
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/PowerFileUtils.java b/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/PowerFileUtils.java
new file mode 100644
index 00000000..1d0331ce
--- /dev/null
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/common/utils/PowerFileUtils.java
@@ -0,0 +1,30 @@
+package tech.powerjob.worker.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import tech.powerjob.common.PowerJobDKey;
+
+/**
+ * 文件工具
+ *
+ * @author tjq
+ * @since 2023/1/22
+ */
+@Slf4j
+public class PowerFileUtils {
+
+ /**
+ * 获取工作目录
+ * @return 允许用户通过启动配置文件自定义存储目录,默认为 user.home
+ */
+ public static String workspace() {
+ String workspaceByDKey = System.getProperty(PowerJobDKey.WORKER_WORK_SPACE);
+ if (StringUtils.isNotEmpty(workspaceByDKey)) {
+ log.info("[PowerFileUtils] [workspace] use custom workspace: {}", workspaceByDKey);
+ return workspaceByDKey;
+ }
+ final String userHome = System.getProperty("user.home").concat("/powerjob/worker");
+ log.info("[PowerFileUtils] [workspace] use user.home as workspace: {}", userHome);
+ return userHome;
+ }
+}
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsContainerFactory.java b/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsContainerFactory.java
index 2834b13b..f857e43c 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsContainerFactory.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/container/OmsContainerFactory.java
@@ -10,6 +10,7 @@ import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import tech.powerjob.worker.common.WorkerRuntime;
+import tech.powerjob.worker.common.utils.PowerFileUtils;
import tech.powerjob.worker.common.utils.TransportUtils;
import java.io.File;
@@ -26,13 +27,13 @@ import java.util.Map;
@Slf4j
public class OmsContainerFactory {
- private static final String CONTAINER_DIR = System.getProperty("user.home") + "/powerjob/worker/container/";
+ private static final String CONTAINER_DIR = PowerFileUtils.workspace() + "/container/";
private static final Map CARGO = Maps.newConcurrentMap();
/**
* 获取容器
* @param containerId 容器ID
- * @param serverActor 当容器不存在且 serverActor 非空时,尝试从服务端重新拉取容器
+ * @param workerRuntime 当容器不存在且 serverActor 非空时,尝试从服务端重新拉取容器
* @return 容器示例,可能为 null
*/
public static OmsContainer fetchContainer(Long containerId, WorkerRuntime workerRuntime) {
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/persistence/ConnectionFactory.java b/powerjob-worker/src/main/java/tech/powerjob/worker/persistence/ConnectionFactory.java
index 60013e7e..dfbe2cd0 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/persistence/ConnectionFactory.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/persistence/ConnectionFactory.java
@@ -8,6 +8,7 @@ import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.h2.Driver;
+import tech.powerjob.worker.common.utils.PowerFileUtils;
import javax.sql.DataSource;
import java.io.File;
@@ -25,7 +26,7 @@ public class ConnectionFactory {
private volatile DataSource dataSource;
- private final String H2_PATH = System.getProperty("user.home") + "/powerjob/worker/h2/" + CommonUtils.genUUID() + "/";
+ private final String H2_PATH = PowerFileUtils.workspace() + "/h2/" + CommonUtils.genUUID() + "/";
private final String DISK_JDBC_URL = String.format("jdbc:h2:file:%spowerjob_worker_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", H2_PATH);
private final String MEMORY_JDBC_URL = String.format("jdbc:h2:mem:%spowerjob_worker_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", H2_PATH);
From e73675ce09aedf30a530e61d164d32610425d47d Mon Sep 17 00:00:00 2001
From: tjq
Date: Mon, 23 Jan 2023 10:18:59 +0800
Subject: [PATCH 079/100] feat: add comment for ProcessorFactory
---
.../powerjob/worker/extension/processor/ProcessorFactory.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/extension/processor/ProcessorFactory.java b/powerjob-worker/src/main/java/tech/powerjob/worker/extension/processor/ProcessorFactory.java
index c4cb098d..67596aab 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/extension/processor/ProcessorFactory.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/extension/processor/ProcessorFactory.java
@@ -1,10 +1,13 @@
package tech.powerjob.worker.extension.processor;
+import tech.powerjob.common.enums.ProcessorType;
+
import java.util.Set;
/**
* 处理器工厂
* 考虑到当前是一个百花齐放的生态,各种 IOC 框架层出不穷。PowerJob 决定在 4.3.0 剥离对 Spring 的强依赖,并允许开发者自定义 Bean 的初始化逻辑
+ * 不知道怎么用的话,可以看看官方提供的 3 个默认实现,比如对接第三方 IOC 框架就类似于 BuiltInSpringProcessorFactory
*
* @author tjq
* @since 2023/1/17
@@ -13,6 +16,7 @@ public interface ProcessorFactory {
/**
* 支持的处理器类型,类型不匹配则跳过该 ProcessorFactory 的加载逻辑
+ * 对应的是控制台的'处理器类型' TAB,不做任何定制的情况下,取值范围为 {@link ProcessorType#name()}
* @return 支持的处理器类型
*/
Set supportTypes();
From 5f75dbe9fca2a704b85cf27fb7183d6c00e463eb Mon Sep 17 00:00:00 2001
From: tjq
Date: Mon, 23 Jan 2023 13:03:32 +0800
Subject: [PATCH 080/100] feat: replace Deprecated method
---
.../java/tech/powerjob/server/core/DispatchService.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
index 3e9eb97e..b0821b62 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/DispatchService.java
@@ -3,13 +3,16 @@ package tech.powerjob.server.core;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
import tech.powerjob.common.RemoteConstant;
import tech.powerjob.common.SystemInstanceResult;
-import tech.powerjob.common.enums.*;
+import tech.powerjob.common.enums.ExecuteType;
+import tech.powerjob.common.enums.InstanceStatus;
+import tech.powerjob.common.enums.ProcessorType;
+import tech.powerjob.common.enums.TimeExpressionType;
import tech.powerjob.common.request.ServerScheduleJobReq;
import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.server.common.Holder;
@@ -20,8 +23,8 @@ import tech.powerjob.server.core.lock.UseCacheLock;
import tech.powerjob.server.persistence.remote.model.InstanceInfoDO;
import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository;
-import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
import tech.powerjob.server.remote.transporter.TransportService;
+import tech.powerjob.server.remote.transporter.impl.ServerURLFactory;
import tech.powerjob.server.remote.worker.WorkerClusterQueryService;
import java.util.ArrayList;
From bc08b76d23d16968d85eac87ba2b1b78b502ff42 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 10:29:34 +0800
Subject: [PATCH 081/100] chore: fix compile error in official-processors
---
powerjob-official-processors/pom.xml | 8 ++++++++
.../processors/impl/sql/SpringDatasourceSqlProcessor.java | 6 +++---
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/powerjob-official-processors/pom.xml b/powerjob-official-processors/pom.xml
index 41229d45..dec5cd16 100644
--- a/powerjob-official-processors/pom.xml
+++ b/powerjob-official-processors/pom.xml
@@ -24,6 +24,7 @@
5.2.9.RELEASE
2.1.214
8.0.28
+ 5.3.23
1.2.83
@@ -75,6 +76,13 @@
provided
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+ provided
+
org.springframework
diff --git a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/sql/SpringDatasourceSqlProcessor.java b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/sql/SpringDatasourceSqlProcessor.java
index 120feb54..b8cf0b10 100644
--- a/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/sql/SpringDatasourceSqlProcessor.java
+++ b/powerjob-official-processors/src/main/java/tech/powerjob/official/processors/impl/sql/SpringDatasourceSqlProcessor.java
@@ -3,13 +3,13 @@ package tech.powerjob.official.processors.impl.sql;
import tech.powerjob.worker.core.processor.TaskContext;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.Assert;
import org.apache.commons.lang3.StringUtils;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
+import java.util.Objects;
/**
* 简单 Spring SQL 处理器,目前只能用 Spring Bean 的方式加载
@@ -75,8 +75,8 @@ public class SpringDatasourceSqlProcessor extends AbstractSqlProcessor {
* @param dataSource 数据源
*/
public void registerDataSource(String dataSourceName, DataSource dataSource) {
- Assert.notNull(dataSourceName, "DataSource name must not be null");
- Assert.notNull(dataSource, "DataSource must not be null");
+ Objects.requireNonNull(dataSourceName, "DataSource name must not be null");
+ Objects.requireNonNull(dataSource, "DataSource must not be null");
dataSourceMap.put(dataSourceName, dataSource);
log.info("register data source({})' successfully.", dataSourceName);
}
From 55e259bcf7f7c49cad73d37af6b82af39d011a76 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 10:39:30 +0800
Subject: [PATCH 082/100] chore: upgrade project version to 4.3.0
---
pom.xml | 2 +-
powerjob-client/pom.xml | 6 +++---
powerjob-common/pom.xml | 4 ++--
powerjob-official-processors/pom.xml | 6 +++---
powerjob-remote/pom.xml | 2 +-
powerjob-remote/powerjob-remote-benchmark/pom.xml | 6 +++---
powerjob-remote/powerjob-remote-framework/pom.xml | 6 +++---
powerjob-remote/powerjob-remote-impl-akka/pom.xml | 6 +++---
powerjob-remote/powerjob-remote-impl-http/pom.xml | 6 +++---
powerjob-server/pom.xml | 10 +++++-----
powerjob-server/powerjob-server-common/pom.xml | 2 +-
powerjob-server/powerjob-server-core/pom.xml | 2 +-
powerjob-server/powerjob-server-extension/pom.xml | 2 +-
powerjob-server/powerjob-server-migrate/pom.xml | 2 +-
powerjob-server/powerjob-server-monitor/pom.xml | 2 +-
powerjob-server/powerjob-server-persistence/pom.xml | 2 +-
powerjob-server/powerjob-server-remote/pom.xml | 2 +-
powerjob-server/powerjob-server-starter/pom.xml | 2 +-
powerjob-worker-agent/pom.xml | 6 +++---
powerjob-worker-samples/pom.xml | 6 +++---
powerjob-worker-spring-boot-starter/pom.xml | 6 +++---
powerjob-worker/pom.xml | 12 ++++++------
22 files changed, 50 insertions(+), 50 deletions(-)
diff --git a/pom.xml b/pom.xml
index e3eb3116..8381f0a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
tech.powerjob
powerjob
- 3.0.0
+ 4.0.0
pom
powerjob
http://www.powerjob.tech
diff --git a/powerjob-client/pom.xml b/powerjob-client/pom.xml
index 94a23dc2..ab5656df 100644
--- a/powerjob-client/pom.xml
+++ b/powerjob-client/pom.xml
@@ -5,18 +5,18 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-client
- 4.2.1
+ 4.3.0
jar
5.9.1
1.2.83
- 4.2.1
+ 4.3.0
3.2.4
diff --git a/powerjob-common/pom.xml b/powerjob-common/pom.xml
index 41387b46..a0966360 100644
--- a/powerjob-common/pom.xml
+++ b/powerjob-common/pom.xml
@@ -5,12 +5,12 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-common
- 4.2.1
+ 4.3.0
jar
diff --git a/powerjob-official-processors/pom.xml b/powerjob-official-processors/pom.xml
index dec5cd16..f84021bb 100644
--- a/powerjob-official-processors/pom.xml
+++ b/powerjob-official-processors/pom.xml
@@ -5,12 +5,12 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-official-processors
- 1.2.2
+ 1.3.0
jar
@@ -20,7 +20,7 @@
5.9.1
1.2.9
- 4.2.1
+ 4.3.0
5.2.9.RELEASE
2.1.214
8.0.28
diff --git a/powerjob-remote/pom.xml b/powerjob-remote/pom.xml
index 166a7b17..5dd8343f 100644
--- a/powerjob-remote/pom.xml
+++ b/powerjob-remote/pom.xml
@@ -5,7 +5,7 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
pom
diff --git a/powerjob-remote/powerjob-remote-benchmark/pom.xml b/powerjob-remote/powerjob-remote-benchmark/pom.xml
index 8bc26d42..827c31cb 100644
--- a/powerjob-remote/powerjob-remote-benchmark/pom.xml
+++ b/powerjob-remote/powerjob-remote-benchmark/pom.xml
@@ -5,7 +5,7 @@
powerjob-remote
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
@@ -21,8 +21,8 @@
1.2.9
2.7.4
- 4.2.1
- 4.2.1
+ 4.3.0
+ 4.3.0
3.9.0
4.2.9
diff --git a/powerjob-remote/powerjob-remote-framework/pom.xml b/powerjob-remote/powerjob-remote-framework/pom.xml
index 5517c827..29e6ca81 100644
--- a/powerjob-remote/powerjob-remote-framework/pom.xml
+++ b/powerjob-remote/powerjob-remote-framework/pom.xml
@@ -5,11 +5,11 @@
powerjob-remote
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
- 4.2.1
+ 4.3.0
powerjob-remote-framework
@@ -17,7 +17,7 @@
8
UTF-8
- 4.2.1
+ 4.3.0
0.10.2
diff --git a/powerjob-remote/powerjob-remote-impl-akka/pom.xml b/powerjob-remote/powerjob-remote-impl-akka/pom.xml
index efe8c902..fdbd6e3d 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/pom.xml
+++ b/powerjob-remote/powerjob-remote-impl-akka/pom.xml
@@ -5,19 +5,19 @@
powerjob-remote
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-remote-impl-akka
- 4.2.1
+ 4.3.0
8
8
UTF-8
- 4.2.1
+ 4.3.0
2.6.20
diff --git a/powerjob-remote/powerjob-remote-impl-http/pom.xml b/powerjob-remote/powerjob-remote-impl-http/pom.xml
index aeb0c407..a7348987 100644
--- a/powerjob-remote/powerjob-remote-impl-http/pom.xml
+++ b/powerjob-remote/powerjob-remote-impl-http/pom.xml
@@ -5,12 +5,12 @@
powerjob-remote
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-remote-impl-http
- 4.2.1
+ 4.3.0
8
@@ -18,7 +18,7 @@
UTF-8
4.3.7
- 4.2.1
+ 4.3.0
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index c0aa342a..e1eb723a 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -5,12 +5,12 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-server
- 4.2.1
+ 4.3.0
pom
@@ -50,9 +50,9 @@
3.0.10
9.1.6
- 4.2.1
- 4.2.1
- 4.2.1
+ 4.3.0
+ 4.3.0
+ 4.3.0
diff --git a/powerjob-server/powerjob-server-common/pom.xml b/powerjob-server/powerjob-server-common/pom.xml
index 227e65b1..c45da96b 100644
--- a/powerjob-server/powerjob-server-common/pom.xml
+++ b/powerjob-server/powerjob-server-common/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-core/pom.xml b/powerjob-server/powerjob-server-core/pom.xml
index 2a3e13ea..8b3d02b3 100644
--- a/powerjob-server/powerjob-server-core/pom.xml
+++ b/powerjob-server/powerjob-server-core/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-extension/pom.xml b/powerjob-server/powerjob-server-extension/pom.xml
index 29ab5693..4ed8e548 100644
--- a/powerjob-server/powerjob-server-extension/pom.xml
+++ b/powerjob-server/powerjob-server-extension/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-migrate/pom.xml b/powerjob-server/powerjob-server-migrate/pom.xml
index 9b8b32b6..282cee69 100644
--- a/powerjob-server/powerjob-server-migrate/pom.xml
+++ b/powerjob-server/powerjob-server-migrate/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-monitor/pom.xml b/powerjob-server/powerjob-server-monitor/pom.xml
index c54bb0df..ccf24dc4 100644
--- a/powerjob-server/powerjob-server-monitor/pom.xml
+++ b/powerjob-server/powerjob-server-monitor/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-persistence/pom.xml b/powerjob-server/powerjob-server-persistence/pom.xml
index a5e6b9f4..bf54efb6 100644
--- a/powerjob-server/powerjob-server-persistence/pom.xml
+++ b/powerjob-server/powerjob-server-persistence/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-remote/pom.xml b/powerjob-server/powerjob-server-remote/pom.xml
index 878289d0..62338062 100644
--- a/powerjob-server/powerjob-server-remote/pom.xml
+++ b/powerjob-server/powerjob-server-remote/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-server/powerjob-server-starter/pom.xml b/powerjob-server/powerjob-server-starter/pom.xml
index 8f3f73df..bb3a3b2c 100644
--- a/powerjob-server/powerjob-server-starter/pom.xml
+++ b/powerjob-server/powerjob-server-starter/pom.xml
@@ -5,7 +5,7 @@
powerjob-server
tech.powerjob
- 4.2.1
+ 4.3.0
../pom.xml
4.0.0
diff --git a/powerjob-worker-agent/pom.xml b/powerjob-worker-agent/pom.xml
index 847e4a50..6eb753a5 100644
--- a/powerjob-worker-agent/pom.xml
+++ b/powerjob-worker-agent/pom.xml
@@ -5,17 +5,17 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-worker-agent
- 4.2.1
+ 4.3.0
jar
- 4.2.1
+ 4.3.0
1.2.9
4.3.2
5.3.23
diff --git a/powerjob-worker-samples/pom.xml b/powerjob-worker-samples/pom.xml
index 8b5ef3c6..00c1d5df 100644
--- a/powerjob-worker-samples/pom.xml
+++ b/powerjob-worker-samples/pom.xml
@@ -5,16 +5,16 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-worker-samples
- 4.2.1
+ 4.3.0
2.7.4
- 4.2.1
+ 4.3.0
1.2.83
1.2.1
diff --git a/powerjob-worker-spring-boot-starter/pom.xml b/powerjob-worker-spring-boot-starter/pom.xml
index cc79470f..be0645ce 100644
--- a/powerjob-worker-spring-boot-starter/pom.xml
+++ b/powerjob-worker-spring-boot-starter/pom.xml
@@ -5,16 +5,16 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-worker-spring-boot-starter
- 4.2.1
+ 4.3.0
jar
- 4.2.1
+ 4.3.0
2.7.4
diff --git a/powerjob-worker/pom.xml b/powerjob-worker/pom.xml
index c83b6583..068e1ceb 100644
--- a/powerjob-worker/pom.xml
+++ b/powerjob-worker/pom.xml
@@ -5,12 +5,12 @@
powerjob
tech.powerjob
- 3.0.0
+ 4.0.0
4.0.0
powerjob-worker
- 4.2.1
+ 4.3.0
jar
@@ -21,10 +21,10 @@
1.2.9
- 4.2.1
- 4.2.1
- 4.2.1
- 4.2.1
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
From 3bfe58abd2a05390ea5cebd186eb949c911664c5 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 12:46:35 +0800
Subject: [PATCH 083/100] feat: process empty return in vertx
---
.../remote/framework/BenchmarkActor.java | 27 +++++++++++++---
.../remote/http/vertx/VertxTransporter.java | 19 +++++++----
.../http/HttpVertxCSInitializerTest.java | 32 +++++++++++++------
3 files changed, 57 insertions(+), 21 deletions(-)
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
index 049949f2..325aa6e2 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/BenchmarkActor.java
@@ -9,6 +9,8 @@ import tech.powerjob.common.utils.CommonUtils;
import tech.powerjob.remote.framework.actor.Actor;
import tech.powerjob.remote.framework.actor.Handler;
+import java.util.Optional;
+
/**
* 基准测试
*
@@ -20,9 +22,9 @@ import tech.powerjob.remote.framework.actor.Handler;
public class BenchmarkActor {
@Handler(path = "standard")
- public BenchmarkResponse processStandardRequest(BenchmarkRequest request) {
+ public BenchmarkResponse standardRequest(BenchmarkRequest request) {
long startTs = System.currentTimeMillis();
- log.info("[BenchmarkActor] receive request: {}", request);
+ log.info("[BenchmarkActor] [standardRequest] receive request: {}", request);
BenchmarkResponse response = new BenchmarkResponse()
.setSuccess(true)
.setContent(request.getContent())
@@ -31,11 +33,28 @@ public class BenchmarkActor {
if (request.getResponseSize() != null && request.getResponseSize() > 0) {
response.setExtra(RandomStringUtils.randomPrint(request.getResponseSize()));
}
+ executeSleep(request);
+ response.setServerCost(System.currentTimeMillis() - startTs);
+ return response;
+ }
+
+ @Handler(path = "emptyReturn")
+ public void emptyReturn(BenchmarkRequest request) {
+ log.info("[BenchmarkActor] [emptyReturn] receive request: {}", request);
+ executeSleep(request);
+ }
+
+ @Handler(path = "stringReturn")
+ public String stringReturn(BenchmarkRequest request) {
+ log.info("[BenchmarkActor] [stringReturn] receive request: {}", request);
+ executeSleep(request);
+ return RandomStringUtils.randomPrint(Optional.ofNullable(request.getResponseSize()).orElse(100));
+ }
+
+ private static void executeSleep(BenchmarkRequest request) {
if (request.getBlockingMills() != null && request.getBlockingMills() > 0) {
CommonUtils.easySleep(request.getBlockingMills());
}
- response.setServerCost(System.currentTimeMillis() - startTs);
- return response;
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java
index b291f39c..e4b545fc 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxTransporter.java
@@ -2,14 +2,9 @@ package tech.powerjob.remote.http.vertx;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.vertx.core.Future;
-import io.vertx.core.Vertx;
import io.vertx.core.http.*;
import io.vertx.core.json.JsonObject;
-import lombok.SneakyThrows;
import tech.powerjob.common.PowerSerializable;
-import tech.powerjob.common.request.ServerScheduleJobReq;
-import tech.powerjob.remote.framework.base.Address;
-import tech.powerjob.remote.framework.base.HandlerLocation;
import tech.powerjob.remote.framework.base.RemotingException;
import tech.powerjob.remote.framework.base.URL;
import tech.powerjob.remote.framework.transporter.Protocol;
@@ -49,6 +44,7 @@ public class VertxTransporter implements Transporter {
return post(url, request, clz);
}
+ @SuppressWarnings("unchecked")
private CompletionStage post(URL url, PowerSerializable request, Class clz) {
final String host = url.getAddress().getHost();
final int port = url.getAddress().getPort();
@@ -72,9 +68,18 @@ public class VertxTransporter implements Transporter {
));
}
- // TODO: 验证无响应的情况
+ return httpClientResponse.body().compose(x -> {
- return httpClientResponse.body().compose(x -> Future.succeededFuture(x.toJsonObject().mapTo(clz)));
+ if (clz == null) {
+ return Future.succeededFuture(null);
+ }
+
+ if (clz.equals(String.class)) {
+ return Future.succeededFuture((T) x.toString());
+ }
+
+ return Future.succeededFuture(x.toJsonObject().mapTo(clz));
+ });
}).toCompletionStage();
}
}
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/test/java/tech/powerjob/remote/http/HttpVertxCSInitializerTest.java b/powerjob-remote/powerjob-remote-impl-http/src/test/java/tech/powerjob/remote/http/HttpVertxCSInitializerTest.java
index 9a25309d..a009293b 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/test/java/tech/powerjob/remote/http/HttpVertxCSInitializerTest.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/test/java/tech/powerjob/remote/http/HttpVertxCSInitializerTest.java
@@ -1,7 +1,6 @@
package tech.powerjob.remote.http;
import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import tech.powerjob.common.enums.Protocol;
@@ -10,8 +9,6 @@ import tech.powerjob.remote.framework.BenchmarkActor;
import tech.powerjob.remote.framework.base.Address;
import tech.powerjob.remote.framework.base.HandlerLocation;
import tech.powerjob.remote.framework.base.URL;
-import tech.powerjob.remote.framework.cs.CSInitializer;
-import tech.powerjob.remote.framework.cs.CSInitializerConfig;
import tech.powerjob.remote.framework.engine.EngineConfig;
import tech.powerjob.remote.framework.engine.EngineOutput;
import tech.powerjob.remote.framework.engine.RemoteEngine;
@@ -21,8 +18,6 @@ import tech.powerjob.remote.framework.transporter.Transporter;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.TimeUnit;
-import static org.junit.jupiter.api.Assertions.*;
-
/**
* HttpVertxCSInitializerTest
*
@@ -47,19 +42,36 @@ class HttpVertxCSInitializerTest {
log.info("[HttpVertxCSInitializerTest] engine start up successfully!");
Transporter transporter = engineOutput.getTransporter();
- URL url = new URL()
- .setAddress(address)
- .setLocation(new HandlerLocation().setMethodPath("standard").setRootPath("benchmark"));
-
BenchmarkActor.BenchmarkRequest request = new BenchmarkActor.BenchmarkRequest()
.setContent("request from test")
.setBlockingMills(100)
.setResponseSize(10240);
+ log.info("[HttpVertxCSInitializerTest] test empty request!");
+ URL emptyURL = new URL()
+ .setAddress(address)
+ .setLocation(new HandlerLocation().setMethodPath("emptyReturn").setRootPath("benchmark"));
+ transporter.tell(emptyURL, request);
+
+ log.info("[HttpVertxCSInitializerTest] test string request!");
+ URL stringURL = new URL()
+ .setAddress(address)
+ .setLocation(new HandlerLocation().setMethodPath("stringReturn").setRootPath("benchmark"));
+ final String strResponse = transporter.ask(stringURL, request, String.class).toCompletableFuture().get();
+ log.info("[HttpVertxCSInitializerTest] strResponse: {}", strResponse);
+
+ log.info("[HttpVertxCSInitializerTest] test normal request!");
+ URL url = new URL()
+ .setAddress(address)
+ .setLocation(new HandlerLocation().setMethodPath("standard").setRootPath("benchmark"));
+
final CompletionStage benchmarkResponseCompletionStage = transporter.ask(url, request, BenchmarkActor.BenchmarkResponse.class);
final BenchmarkActor.BenchmarkResponse response = benchmarkResponseCompletionStage.toCompletableFuture().get(10, TimeUnit.SECONDS);
log.info("[HttpVertxCSInitializerTest] response: {}", response);
- CommonUtils.easySleep(1000000000);
+
+
+
+ CommonUtils.easySleep(10000);
}
}
\ No newline at end of file
From 1b1efe6b80b6705fa7c9b6e7387df8034a6d69f8 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 12:56:56 +0800
Subject: [PATCH 084/100] feat: optimize vertx config
---
.../powerjob/remote/http/vertx/VertxInitializer.java | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java
index 602f1df0..d74c0591 100644
--- a/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java
+++ b/powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/vertx/VertxInitializer.java
@@ -26,16 +26,22 @@ public class VertxInitializer {
*/
private static final int DEFAULT_KEEP_ALIVE_TIMEOUT = 75;
- private static final int CONNECTION_TIMEOUT_MS = 2000;
+ private static final int CONNECTION_TIMEOUT_MS = 3000;
+
+ private static final int SERVER_IDLE_TIMEOUT_S = 300;
public static Vertx buildVertx() {
- VertxOptions options = new VertxOptions();
+ final int cpuCores = Runtime.getRuntime().availableProcessors();
+ VertxOptions options = new VertxOptions()
+ .setWorkerPoolSize(Math.max(16, 2 * cpuCores))
+ .setInternalBlockingPoolSize(Math.max(32, 4 * cpuCores));
log.info("[PowerJob-Vertx] use vertx options: {}", options);
return Vertx.vertx(options);
}
public static HttpServer buildHttpServer(Vertx vertx) {
- HttpServerOptions httpServerOptions = new HttpServerOptions();
+ HttpServerOptions httpServerOptions = new HttpServerOptions()
+ .setIdleTimeout(SERVER_IDLE_TIMEOUT_S);
tryEnableCompression(httpServerOptions);
log.info("[PowerJob-Vertx] use HttpServerOptions: {}", httpServerOptions.toJson());
return vertx.createHttpServer(httpServerOptions);
From 7b56393aee2b2a1c8c862dc591c3cf345b648441 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 13:23:34 +0800
Subject: [PATCH 085/100] feat: use softValues to optimize memory usage
---
.../server/core/service/CacheService.java | 4 ++++
.../alarm/impl/DingTalkAlarmService.java | 23 +++++++++----------
2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/CacheService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/CacheService.java
index 491ea328..c4ae22a4 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/CacheService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/service/CacheService.java
@@ -44,18 +44,22 @@ public class CacheService {
jobId2JobNameCache = CacheBuilder.newBuilder()
.expireAfterWrite(Duration.ofMinutes(1))
.maximumSize(512)
+ .softValues()
.build();
workflowId2WorkflowNameCache = CacheBuilder.newBuilder()
.expireAfterWrite(Duration.ofMinutes(1))
.maximumSize(512)
+ .softValues()
.build();
instanceId2AppId = CacheBuilder.newBuilder()
.maximumSize(1024)
+ .softValues()
.build();
jobId2AppId = CacheBuilder.newBuilder()
.maximumSize(1024)
+ .softValues()
.build();
}
diff --git a/powerjob-server/powerjob-server-extension/src/main/java/tech/powerjob/server/extension/defaultimpl/alarm/impl/DingTalkAlarmService.java b/powerjob-server/powerjob-server-extension/src/main/java/tech/powerjob/server/extension/defaultimpl/alarm/impl/DingTalkAlarmService.java
index b42d9c05..57eb4d35 100644
--- a/powerjob-server/powerjob-server-extension/src/main/java/tech/powerjob/server/extension/defaultimpl/alarm/impl/DingTalkAlarmService.java
+++ b/powerjob-server/powerjob-server-extension/src/main/java/tech/powerjob/server/extension/defaultimpl/alarm/impl/DingTalkAlarmService.java
@@ -1,25 +1,24 @@
package tech.powerjob.server.extension.defaultimpl.alarm.impl;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
import tech.powerjob.common.OmsConstant;
import tech.powerjob.common.exception.PowerJobException;
import tech.powerjob.common.utils.NetUtils;
import tech.powerjob.server.common.PowerJobServerConfigKey;
import tech.powerjob.server.common.SJ;
-import tech.powerjob.server.persistence.remote.model.UserInfoDO;
-import tech.powerjob.server.extension.defaultimpl.alarm.module.Alarm;
import tech.powerjob.server.extension.Alarmable;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Service;
+import tech.powerjob.server.extension.defaultimpl.alarm.module.Alarm;
+import tech.powerjob.server.persistence.remote.model.UserInfoDO;
import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
@@ -108,7 +107,7 @@ public class DingTalkAlarmService implements Alarmable {
}
this.agentId = Long.valueOf(agentId);
dingTalkUtils = new DingTalkUtils(appKey, appSecret);
- mobile2UserIdCache = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).build();
+ mobile2UserIdCache = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).softValues().build();
log.info("[DingTalkAlarmService] init DingTalkAlarmService successfully!");
}
From a9f81d260c8f1909bf6d4cef737913d625cd1dac Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 15:22:53 +0800
Subject: [PATCH 086/100] feat: add script for build test env
---
others/dev/build_test_env.sh | 19 +++++
others/dev/docker-compose.yml | 74 +++++++++++++++++++
.../remote/akka/AkkaCSInitializer.java | 2 +-
powerjob-worker-agent/Dockerfile | 5 +-
4 files changed, 98 insertions(+), 2 deletions(-)
create mode 100755 others/dev/build_test_env.sh
create mode 100644 others/dev/docker-compose.yml
diff --git a/others/dev/build_test_env.sh b/others/dev/build_test_env.sh
new file mode 100755
index 00000000..b14f4bb1
--- /dev/null
+++ b/others/dev/build_test_env.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+# 构建 PowerJob 测试环境
+
+echo "================== 关闭全部服务 =================="
+docker-compose down
+echo "================== 构建 jar =================="
+cd `dirname $0`/../.. || exit
+# mvn clean package -Pdev -DskipTests -U -e -pl powerjob-server,powerjob-worker-agent -am
+# -U:强制检查snapshot库 -pl:指定需要构建的模块,多模块逗号分割 -am:同时构建依赖模块,一般与pl连用 -Pxxx:指定使用的配置文件
+mvn clean package -Pdev -DskipTests
+echo "================== 拷贝 jar =================="
+/bin/cp -rf powerjob-server/powerjob-server-starter/target/*.jar powerjob-server/docker/powerjob-server.jar
+/bin/cp -rf powerjob-worker-agent/target/*.jar powerjob-worker-agent/powerjob-agent.jar
+ls -l powerjob-server/docker/powerjob-server.jar
+ls -l powerjob-worker-agent/powerjob-agent.jar
+
+cd others/dev
+docker-compose build
+docker-compose up
\ No newline at end of file
diff --git a/others/dev/docker-compose.yml b/others/dev/docker-compose.yml
new file mode 100644
index 00000000..2b0e53ca
--- /dev/null
+++ b/others/dev/docker-compose.yml
@@ -0,0 +1,74 @@
+# 构建 PowerJob 测试环境
+
+version: '3'
+services:
+ powerjob-mysql:
+ build:
+ context: ../
+ environment:
+ MYSQL_ROOT_HOST: "%"
+ MYSQL_ROOT_PASSWORD: No1Bug2Please3!
+ restart: always
+ container_name: powerjob-mysql
+ image: powerjob/powerjob-mysql:test_env
+ ports:
+ - "3309:3306"
+ volumes:
+ - ./powerjob-data/powerjob-mysql:/var/lib/mysql
+ command: --lower_case_table_names=1
+
+ powerjob-server:
+ build:
+ context: ../../powerjob-server/docker
+ container_name: powerjob-server
+ image: powerjob/powerjob-server:test_env
+ restart: always
+ depends_on:
+ - powerjob-mysql
+ environment:
+ PARAMS: "--oms.mongodb.enable=false --spring.datasource.core.jdbc-url=jdbc:mysql://powerjob-mysql:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
+ ports:
+ - "7700:7700"
+ - "10086:10086"
+ - "10010:10010"
+ volumes:
+ - ./powerjob-data/powerjob-server:/root/powerjob/server/
+
+ powerjob-worker-agent:
+ build:
+ context: ../../powerjob-worker-agent
+ container_name: powerjob-worker-agent
+ image: powerjob/powerjob-worker-agent:test_env
+ restart: always
+ depends_on:
+ - powerjob-mysql
+ - powerjob-server
+ ports:
+ - "5002:5005"
+ - "10002:10000"
+ - "27777:27777"
+ volumes:
+ - ./powerjob-data/powerjob-worker-agent:/root
+ entrypoint:
+ - "sh"
+ - "-c"
+ - "./wait-for-it.sh powerjob-server:7700 --strict -- java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.rmi.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /powerjob-agent.jar --app powerjob-worker-samples --server powerjob-server:7700"
+
+ powerjob-worker-agent2:
+ container_name: powerjob-worker-agent2
+ image: powerjob/powerjob-worker-agent:test_env
+ restart: always
+ depends_on:
+ - powerjob-mysql
+ - powerjob-server
+ ports:
+ - "5003:5005"
+ - "10003:10000"
+ - "27778:27777"
+ volumes:
+ - ./powerjob-data/powerjob-worker-agent2:/root
+ entrypoint:
+ - "sh"
+ - "-c"
+ - "./wait-for-it.sh powerjob-server:7700 --strict -- java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.rmi.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /powerjob-agent.jar --app powerjob-worker-samples --server powerjob-server:7700"
+
diff --git a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java
index 28ba093e..cad05a8f 100644
--- a/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java
+++ b/powerjob-remote/powerjob-remote-impl-akka/src/main/java/tech/powerjob/remote/akka/AkkaCSInitializer.java
@@ -53,7 +53,7 @@ public class AkkaCSInitializer implements CSInitializer {
Config akkaBasicConfig = ConfigFactory.load(AkkaConstant.AKKA_CONFIG);
Config akkaFinalConfig = ConfigFactory.parseMap(overrideConfig).withFallback(akkaBasicConfig);
- log.info("[PowerJob-AKKA] try to start AKKA System by config: {}", akkaFinalConfig);
+ log.info("[PowerJob-AKKA] try to start AKKA System.");
// 启动时绑定当前的 actorSystemName
String actorSystemName = AkkaConstant.fetchActorSystemName(config.getServerType());
diff --git a/powerjob-worker-agent/Dockerfile b/powerjob-worker-agent/Dockerfile
index f33b43e1..c7b3160e 100644
--- a/powerjob-worker-agent/Dockerfile
+++ b/powerjob-worker-agent/Dockerfile
@@ -13,7 +13,10 @@ RUN apt-get update && \
&& apt-get clean \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/*
-
+# 安装 wait-for-it 脚本
+RUN curl -o wait-for-it.sh https://gitee.com/KFCFans/wait-for-it/raw/master/wait-for-it.sh
+RUN chmod +x wait-for-it.sh
+# 拷贝主文件
COPY powerjob-agent.jar /powerjob-agent.jar
# 暴露端口(AKKA-Client)
EXPOSE 27777
From da4aa8a9fe3032ed6c8a3f6fab1801890b64c365 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 15:54:34 +0800
Subject: [PATCH 087/100] chore: optimize test env
---
others/dev/build_test_env.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/others/dev/build_test_env.sh b/others/dev/build_test_env.sh
index b14f4bb1..310d9e03 100755
--- a/others/dev/build_test_env.sh
+++ b/others/dev/build_test_env.sh
@@ -7,7 +7,7 @@ echo "================== 构建 jar =================="
cd `dirname $0`/../.. || exit
# mvn clean package -Pdev -DskipTests -U -e -pl powerjob-server,powerjob-worker-agent -am
# -U:强制检查snapshot库 -pl:指定需要构建的模块,多模块逗号分割 -am:同时构建依赖模块,一般与pl连用 -Pxxx:指定使用的配置文件
-mvn clean package -Pdev -DskipTests
+mvn clean package -Pdev -DskipTests -pl powerjob-server,powerjob-worker-agent -am
echo "================== 拷贝 jar =================="
/bin/cp -rf powerjob-server/powerjob-server-starter/target/*.jar powerjob-server/docker/powerjob-server.jar
/bin/cp -rf powerjob-worker-agent/target/*.jar powerjob-worker-agent/powerjob-agent.jar
From 6921cfdcf5ba1d00f1730414f8779e1cc86e5cdb Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 16:10:53 +0800
Subject: [PATCH 088/100] chore: optimize test env
---
others/dev/build_test_env.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/others/dev/build_test_env.sh b/others/dev/build_test_env.sh
index 310d9e03..ff5325f8 100755
--- a/others/dev/build_test_env.sh
+++ b/others/dev/build_test_env.sh
@@ -7,7 +7,7 @@ echo "================== 构建 jar =================="
cd `dirname $0`/../.. || exit
# mvn clean package -Pdev -DskipTests -U -e -pl powerjob-server,powerjob-worker-agent -am
# -U:强制检查snapshot库 -pl:指定需要构建的模块,多模块逗号分割 -am:同时构建依赖模块,一般与pl连用 -Pxxx:指定使用的配置文件
-mvn clean package -Pdev -DskipTests -pl powerjob-server,powerjob-worker-agent -am
+mvn clean package -Pdev -DskipTests -pl powerjob-server-starter,powerjob-worker-agent -am
echo "================== 拷贝 jar =================="
/bin/cp -rf powerjob-server/powerjob-server-starter/target/*.jar powerjob-server/docker/powerjob-server.jar
/bin/cp -rf powerjob-worker-agent/target/*.jar powerjob-worker-agent/powerjob-agent.jar
From 8df74b9670b073f58f3ed41e74e2b3d88c208150 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 16:12:15 +0800
Subject: [PATCH 089/100] chore: optimize test env
---
others/dev/build_test_env.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/others/dev/build_test_env.sh b/others/dev/build_test_env.sh
index ff5325f8..259390dd 100755
--- a/others/dev/build_test_env.sh
+++ b/others/dev/build_test_env.sh
@@ -7,7 +7,7 @@ echo "================== 构建 jar =================="
cd `dirname $0`/../.. || exit
# mvn clean package -Pdev -DskipTests -U -e -pl powerjob-server,powerjob-worker-agent -am
# -U:强制检查snapshot库 -pl:指定需要构建的模块,多模块逗号分割 -am:同时构建依赖模块,一般与pl连用 -Pxxx:指定使用的配置文件
-mvn clean package -Pdev -DskipTests -pl powerjob-server-starter,powerjob-worker-agent -am
+mvn clean package -Pdev
echo "================== 拷贝 jar =================="
/bin/cp -rf powerjob-server/powerjob-server-starter/target/*.jar powerjob-server/docker/powerjob-server.jar
/bin/cp -rf powerjob-worker-agent/target/*.jar powerjob-worker-agent/powerjob-agent.jar
From 2bd2ceca8efcb6450f7c39b65143802924315d24 Mon Sep 17 00:00:00 2001
From: tjq
Date: Tue, 24 Jan 2023 16:12:54 +0800
Subject: [PATCH 090/100] chore: optimize test env
---
others/dev/build_test_env.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/others/dev/build_test_env.sh b/others/dev/build_test_env.sh
index 259390dd..b14f4bb1 100755
--- a/others/dev/build_test_env.sh
+++ b/others/dev/build_test_env.sh
@@ -7,7 +7,7 @@ echo "================== 构建 jar =================="
cd `dirname $0`/../.. || exit
# mvn clean package -Pdev -DskipTests -U -e -pl powerjob-server,powerjob-worker-agent -am
# -U:强制检查snapshot库 -pl:指定需要构建的模块,多模块逗号分割 -am:同时构建依赖模块,一般与pl连用 -Pxxx:指定使用的配置文件
-mvn clean package -Pdev
+mvn clean package -Pdev -DskipTests
echo "================== 拷贝 jar =================="
/bin/cp -rf powerjob-server/powerjob-server-starter/target/*.jar powerjob-server/docker/powerjob-server.jar
/bin/cp -rf powerjob-worker-agent/target/*.jar powerjob-worker-agent/powerjob-agent.jar
From 54beb3b2d1542d65872fc752c0116b31722db2cf Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 11:22:16 +0800
Subject: [PATCH 091/100] feat: optimize container service
---
.../powerjob/server/core/container/ContainerService.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
index 5af8d0b3..35de0310 100644
--- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
+++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/container/ContainerService.java
@@ -248,6 +248,7 @@ public class ContainerService {
container.setGmtModified(now);
container.setLastDeployTime(now);
containerInfoRepository.saveAndFlush(container);
+ remote.sendText(String.format("SYSTEM: update current container version=%s successfully!", container.getVersion()));
// 开始部署(需要分批进行)
final List allAliveWorkers = workerClusterQueryService.getAllAliveWorkers(container.getAppId());
@@ -420,7 +421,10 @@ public class ContainerService {
FileUtils.copyFile(jarWithDependency, localFile);
return localFile;
- }finally {
+ } catch (Throwable t) {
+ log.error("[ContainerService] prepareJarFile failed for container: {}", container, t);
+ remote.sendText("SYSTEM: [ERROR] prepare jar file failed: " + ExceptionUtils.getStackTrace(t));
+ } finally {
// 删除工作区数据
FileUtils.forceDelete(workerDir);
}
From fb2046649ed525b0ca7eee682baadea7fe41b248 Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 13:05:35 +0800
Subject: [PATCH 092/100] feat: optimize code
---
.../powerjob-server-starter/src/main/resources/banner.txt | 2 +-
.../src/main/java/tech/powerjob/worker/PowerJobWorker.java | 6 +-----
.../worker/core/tracker/task/light/LightTaskTracker.java | 2 +-
3 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/banner.txt b/powerjob-server/powerjob-server-starter/src/main/resources/banner.txt
index 6ca0bdbc..e52ab26f 100644
--- a/powerjob-server/powerjob-server-starter/src/main/resources/banner.txt
+++ b/powerjob-server/powerjob-server-starter/src/main/resources/banner.txt
@@ -11,5 +11,5 @@ ${AnsiColor.BRIGHT_RED}
* Maintainer: tengjiqi@gmail.com & Team PowerJob
* OfficialWebsite: http://www.powerjob.tech/
* SourceCode: https://github.com/PowerJob/PowerJob
-* PoweredBy: SpringBoot${spring-boot.formatted-version} & Akka (v2.6.12) & Vert.x (v4.0.2)
+* PoweredBy: SpringBoot${spring-boot.formatted-version}
${AnsiColor.DEFAULT}
\ No newline at end of file
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/PowerJobWorker.java b/powerjob-worker/src/main/java/tech/powerjob/worker/PowerJobWorker.java
index bd50df56..61ea7271 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/PowerJobWorker.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/PowerJobWorker.java
@@ -68,11 +68,7 @@ public class PowerJobWorker {
log.info("[PowerJobWorker] start to initialize PowerJobWorker...");
PowerJobWorkerConfig config = workerRuntime.getWorkerConfig();
-
- // 打印 worker 配置
- log.info("[PowerJobWorker] worker config: {}", JsonUtils.toJSONString(config));
-
- CommonUtils.requireNonNull(config, "can't find OhMyConfig, please set OhMyConfig first");
+ CommonUtils.requireNonNull(config, "can't find PowerJobWorkerConfig, please set PowerJobWorkerConfig first");
try {
PowerBannerPrinter.print();
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/task/light/LightTaskTracker.java b/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/task/light/LightTaskTracker.java
index 93d4be37..66da591b 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/task/light/LightTaskTracker.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/task/light/LightTaskTracker.java
@@ -108,7 +108,7 @@ public class LightTaskTracker extends TaskTracker {
// 提交任务到线程池
processFuture = workerRuntime.getExecutorManager().getLightweightTaskExecutorService().submit(this::processTask);
} catch (Exception e) {
- log.warn("[TaskTracker-{}] fail to create TaskTracker for req:{} ", instanceId, req);
+ log.error("[TaskTracker-{}] fail to create TaskTracker for req:{} ", instanceId, req);
destroy();
throw e;
}
From a25eac67c77dcc320b6a1ef593e5f4e363786362 Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 13:13:56 +0800
Subject: [PATCH 093/100] fix: create TaskTracker failed causes HashMap to
deadlock
---
.../core/tracker/manager/LightTaskTrackerManager.java | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/manager/LightTaskTrackerManager.java b/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/manager/LightTaskTrackerManager.java
index eef65f39..5ed0f60e 100644
--- a/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/manager/LightTaskTrackerManager.java
+++ b/powerjob-worker/src/main/java/tech/powerjob/worker/core/tracker/manager/LightTaskTrackerManager.java
@@ -21,8 +21,11 @@ public class LightTaskTrackerManager {
return INSTANCE_ID_2_TASK_TRACKER.get(instanceId);
}
- public static LightTaskTracker removeTaskTracker(Long instanceId) {
- return INSTANCE_ID_2_TASK_TRACKER.remove(instanceId);
+ public static void removeTaskTracker(Long instanceId) {
+ // 忽略印度的 IDE 警告,这个判断非常有用!!!不加这个判断会导致:如果创建 TT(先执行 computeIfAbsent 正在将TT添加到 HashMap) 时报错,TT 主动调用 destroy 销毁(从 HashMap移除该 TT)时死锁
+ if (INSTANCE_ID_2_TASK_TRACKER.containsKey(instanceId)) {
+ INSTANCE_ID_2_TASK_TRACKER.remove(instanceId);
+ }
}
public static void atomicCreateTaskTracker(Long instanceId, Function creator) {
From c9f5fb3f51429c775fad8e527da543032f881e18 Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 15:22:19 +0800
Subject: [PATCH 094/100] feat: optimize container log
---
.../powerjob/server/web/controller/ContainerController.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java
index 4b1aca3e..02acd5d0 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ContainerController.java
@@ -60,6 +60,8 @@ public class ContainerController {
File file = containerService.fetchContainerJarFile(version);
if (file.exists()) {
OmsFileUtils.file2HttpResponse(file, response);
+ } else {
+ log.error("[Container] can't find container by version[{}], please deploy first!", version);
}
}
From 19a3f2fbedb6264c446f1aa7f510bf90e8528a4e Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 15:58:53 +0800
Subject: [PATCH 095/100] docs: optimize readme
---
README_zhCN.md | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/README_zhCN.md b/README_zhCN.md
index aaf56372..3fe70d47 100644
--- a/README_zhCN.md
+++ b/README_zhCN.md
@@ -1,5 +1,9 @@
# [English](./README.md) | 简体中文
+
+祝大家兔年吉祥,新的一年身体健康,万事如意,阖家欢乐,幸福安康!
+
+
@@ -34,8 +38,7 @@ PowerJob(原OhMyScheduler)是全新一代分布式调度与计算框架,
PowerJob 的设计目标为企业级的分布式任务调度平台,即成为公司内部的**任务调度中间件**。整个公司统一部署调度中心 powerjob-server,旗下所有业务线应用只需要依赖 `powerjob-worker` 即可接入调度中心获取任务调度与分布式计算能力。
### 在线试用
-* 试用地址:[try.powerjob.tech](http://try.powerjob.tech/#/welcome?appName=powerjob-agent-test&password=123)
-* [建议先阅读使用教程了解 PowerJob 的概念和基本用法](https://www.yuque.com/powerjob/guidence/trial)
+* [点击查看试用说明和教程](https://www.yuque.com/powerjob/guidence/trial)
### 同类产品对比
| | QuartZ | xxl-job | SchedulerX 2.0 | PowerJob |
From 31d9b5b7e604dd3213fdb76705cc87e4dedfffeb Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 16:10:40 +0800
Subject: [PATCH 096/100] chore: optimize test env script
---
others/dev/docker-compose.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/others/dev/docker-compose.yml b/others/dev/docker-compose.yml
index 2b0e53ca..2d0850e7 100644
--- a/others/dev/docker-compose.yml
+++ b/others/dev/docker-compose.yml
@@ -14,7 +14,7 @@ services:
ports:
- "3309:3306"
volumes:
- - ./powerjob-data/powerjob-mysql:/var/lib/mysql
+ - ~/powerjob-data/powerjob-mysql:/var/lib/mysql
command: --lower_case_table_names=1
powerjob-server:
@@ -32,7 +32,7 @@ services:
- "10086:10086"
- "10010:10010"
volumes:
- - ./powerjob-data/powerjob-server:/root/powerjob/server/
+ - ~/powerjob-data/powerjob-server:/root/powerjob/server/
powerjob-worker-agent:
build:
@@ -48,7 +48,7 @@ services:
- "10002:10000"
- "27777:27777"
volumes:
- - ./powerjob-data/powerjob-worker-agent:/root
+ - ~/powerjob-data/powerjob-worker-agent:/root
entrypoint:
- "sh"
- "-c"
@@ -66,7 +66,7 @@ services:
- "10003:10000"
- "27778:27777"
volumes:
- - ./powerjob-data/powerjob-worker-agent2:/root
+ - ~/powerjob-data/powerjob-worker-agent2:/root
entrypoint:
- "sh"
- "-c"
From d9b1272802c253f6344073a44ee79c7ec07a38bd Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 19:08:23 +0800
Subject: [PATCH 097/100] chore: optimize test env script
---
others/dev/docker-compose.yml | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/others/dev/docker-compose.yml b/others/dev/docker-compose.yml
index 2d0850e7..2a6d55e3 100644
--- a/others/dev/docker-compose.yml
+++ b/others/dev/docker-compose.yml
@@ -26,7 +26,8 @@ services:
depends_on:
- powerjob-mysql
environment:
- PARAMS: "--oms.mongodb.enable=false --spring.datasource.core.jdbc-url=jdbc:mysql://powerjob-mysql:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
+ PARAMS: "--spring.profiles.active=product --oms.mongodb.enable=false --spring.datasource.core.jdbc-url=jdbc:mysql://powerjob-mysql:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
+ JVMOPTIONS: "-Xmx1024m"
ports:
- "7700:7700"
- "10086:10086"
@@ -52,7 +53,7 @@ services:
entrypoint:
- "sh"
- "-c"
- - "./wait-for-it.sh powerjob-server:7700 --strict -- java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.rmi.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /powerjob-agent.jar --app powerjob-worker-samples --server powerjob-server:7700"
+ - "./wait-for-it.sh powerjob-server:7700 --strict -- java -Xmx768m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.rmi.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /powerjob-agent.jar --app powerjob-worker-samples --server powerjob-server:7700"
powerjob-worker-agent2:
container_name: powerjob-worker-agent2
@@ -70,5 +71,5 @@ services:
entrypoint:
- "sh"
- "-c"
- - "./wait-for-it.sh powerjob-server:7700 --strict -- java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.rmi.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /powerjob-agent.jar --app powerjob-worker-samples --server powerjob-server:7700"
+ - "./wait-for-it.sh powerjob-server:7700 --strict -- java -Xmx768m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.rmi.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /powerjob-agent.jar --app powerjob-worker-samples --server powerjob-server:7700"
From 1c60f17b1bb834a0648ea81ee3bd324c53279b44 Mon Sep 17 00:00:00 2001
From: tjq
Date: Fri, 27 Jan 2023 19:16:54 +0800
Subject: [PATCH 098/100] feat: optimize server info
---
.../server/common/module/ServerInfo.java | 2 ++
.../server/self/ServerInfoServiceImpl.java | 15 +++++++--------
.../web/controller/ServerController.java | 19 ++++++++++++++++---
3 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/module/ServerInfo.java b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/module/ServerInfo.java
index d2c004fa..c264b258 100644
--- a/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/module/ServerInfo.java
+++ b/powerjob-server/powerjob-server-common/src/main/java/tech/powerjob/server/common/module/ServerInfo.java
@@ -15,5 +15,7 @@ public class ServerInfo {
private String ip;
+ private long bornTime;
+
private String version = "UNKNOWN";
}
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/self/ServerInfoServiceImpl.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/self/ServerInfoServiceImpl.java
index eb94b58b..8a205e49 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/self/ServerInfoServiceImpl.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/self/ServerInfoServiceImpl.java
@@ -1,22 +1,20 @@
package tech.powerjob.server.remote.server.self;
+import com.google.common.base.Stopwatch;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.info.BuildProperties;
-import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
import tech.powerjob.common.exception.PowerJobException;
import tech.powerjob.common.utils.CommonUtils;
import tech.powerjob.common.utils.NetUtils;
-import tech.powerjob.server.common.constants.PJThreadPool;
import tech.powerjob.server.common.module.ServerInfo;
import tech.powerjob.server.extension.LockService;
import tech.powerjob.server.persistence.remote.model.ServerInfoDO;
import tech.powerjob.server.persistence.remote.repository.ServerInfoRepository;
-import com.google.common.base.Stopwatch;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.time.DateUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@@ -50,6 +48,7 @@ public class ServerInfoServiceImpl implements ServerInfoService {
String ip = NetUtils.getLocalHost();
serverInfo.setIp(ip);
+ serverInfo.setBornTime(System.currentTimeMillis());
this.serverInfoRepository = serverInfoRepository;
Stopwatch sw = Stopwatch.createStarted();
diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
index 5617a6c6..c9c71dcf 100644
--- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
+++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/web/controller/ServerController.java
@@ -11,6 +11,8 @@ import tech.powerjob.common.request.ServerDiscoveryRequest;
import tech.powerjob.common.response.ResultDTO;
import tech.powerjob.common.utils.CommonUtils;
import tech.powerjob.common.utils.NetUtils;
+import tech.powerjob.server.common.aware.ServerInfoAware;
+import tech.powerjob.server.common.module.ServerInfo;
import tech.powerjob.server.persistence.remote.model.AppInfoDO;
import tech.powerjob.server.persistence.remote.repository.AppInfoRepository;
import tech.powerjob.server.remote.server.election.ServerElectionService;
@@ -30,8 +32,9 @@ import java.util.TimeZone;
@RestController
@RequestMapping("/server")
@RequiredArgsConstructor
-public class ServerController {
+public class ServerController implements ServerInfoAware {
+ private ServerInfo serverInfo;
private final TransportService transportService;
private final ServerElectionService serverElectionService;
@@ -56,15 +59,25 @@ public class ServerController {
public ResultDTO ping(@RequestParam(required = false) boolean debug) {
JSONObject res = new JSONObject();
res.put("localHost", NetUtils.getLocalHost());
- res.put("defaultAddress", transportService.defaultProtocol());
+ res.put("serverInfo", serverInfo);
res.put("serverTime", CommonUtils.formatTime(System.currentTimeMillis()));
+ res.put("serverTimeTs", System.currentTimeMillis());
res.put("serverTimeZone", TimeZone.getDefault().getDisplayName());
res.put("appIds", workerClusterQueryService.getAppId2ClusterStatus().keySet());
if (debug) {
res.put("appId2ClusterInfo", JSON.parseObject(JSON.toJSONString(workerClusterQueryService.getAppId2ClusterStatus())));
-
}
+
+ try {
+ res.put("defaultAddress", JSONObject.toJSON(transportService.defaultProtocol()));
+ } catch (Exception ignore) {
+ }
+
return ResultDTO.success(res);
}
+ @Override
+ public void setServerInfo(ServerInfo serverInfo) {
+ this.serverInfo = serverInfo;
+ }
}
From b0fae5edf84409f0fb01cf908472332b55e7ae36 Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 28 Jan 2023 10:51:19 +0800
Subject: [PATCH 099/100] docs: optimize comment
---
.../remote/transporter/impl/PowerTransportService.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
index 3e649baa..d5d2f624 100644
--- a/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
+++ b/powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/transporter/impl/PowerTransportService.java
@@ -43,11 +43,14 @@ import java.util.concurrent.CompletionStage;
@Service
public class PowerTransportService implements TransportService, InitializingBean, DisposableBean, ApplicationContextAware {
+ /**
+ * server 需要激活的通讯协议,建议激活全部支持的协议
+ */
@Value("${oms.transporter.active.protocols}")
private String activeProtocols;
/**
- * 主要通讯协议,用于 server 与 server 之间的通讯,用户必须保证该协议可用!
+ * 主要通讯协议,用于 server 与 server 之间的通讯,用户必须保证该协议可用(端口开放)!
*/
@Value("${oms.transporter.main.protocol}")
private String mainProtocol;
From d5b4faa49ca1252265049b5bde422f2cafe7c4cf Mon Sep 17 00:00:00 2001
From: tjq
Date: Sat, 28 Jan 2023 12:16:47 +0800
Subject: [PATCH 100/100] chore: update docker build script
---
docker-compose.yml | 8 +++---
.../build_docker.sh => dev/publish_docker.sh} | 27 +++++++++++++++++++
2 files changed, 30 insertions(+), 5 deletions(-)
rename others/{script/build_docker.sh => dev/publish_docker.sh} (74%)
diff --git a/docker-compose.yml b/docker-compose.yml
index d12faee8..cdec2914 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,14 +5,12 @@
version: '3'
services:
powerjob-mysql:
- build:
- context: ./others
environment:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: No1Bug2Please3!
restart: always
container_name: powerjob-mysql
- image: powerjob/powerjob-mysql:4.1.1
+ image: powerjob/powerjob-mysql:latest
ports:
- "3307:3306"
volumes:
@@ -21,7 +19,7 @@ services:
powerjob-server:
container_name: powerjob-server
- image: tjqq/powerjob-server:latest
+ image: powerjob/powerjob-server:latest
restart: always
depends_on:
- powerjob-mysql
@@ -36,7 +34,7 @@ services:
powerjob-worker-samples:
container_name: powerjob-worker-samples
- image: tjqq/powerjob-worker-samples:latest
+ image: powerjob/powerjob-worker-samples:latest
restart: always
depends_on:
- powerjob-mysql
diff --git a/others/script/build_docker.sh b/others/dev/publish_docker.sh
similarity index 74%
rename from others/script/build_docker.sh
rename to others/dev/publish_docker.sh
index 4149668e..ee295e3d 100755
--- a/others/script/build_docker.sh
+++ b/others/dev/publish_docker.sh
@@ -33,11 +33,19 @@ read -r -p "是否重新构建镜像(y/n):" rebuild
if [ "$rebuild" = "y" ] || [ "$rebuild" = "Y" ]; then
echo "================== 删除旧镜像 =================="
docker rmi -f tjqq/powerjob-server:$version
+ docker rmi -f powerjob/powerjob-server:$version
docker rmi -f tjqq/powerjob-agent:$version
+ docker rmi -f powerjob/powerjob-agent:$version
+ docker rmi -f powerjob/powerjob-mysql:$version
+ docker rmi -f powerjob/powerjob-worker-samples:$version
echo "================== 构建 powerjob-server 镜像 =================="
docker build -t tjqq/powerjob-server:$version powerjob-server/docker/. || exit
echo "================== 构建 powerjob-agent 镜像 =================="
docker build -t tjqq/powerjob-agent:$version powerjob-worker-agent/. || exit
+ echo "================== 构建 powerjob-mysql 镜像 =================="
+ docker build -t powerjob/powerjob-mysql:$version others/. || exit
+ echo "================== 构建 powerjob-worker-samples 镜像 =================="
+ docker build -t powerjob/powerjob-worker-samples:$version powerjob-worker-samples/. || exit
read -r -p "是否正式发布该镜像(y/n):" needrelease
if [ "$needrelease" = "y" ] || [ "$needrelease" = "Y" ]; then
@@ -47,6 +55,25 @@ if [ "$rebuild" = "y" ] || [ "$rebuild" = "Y" ]; then
docker push tjqq/powerjob-server:$version
echo "================== 正在推送 agent 镜像到中央仓库 =================="
docker push tjqq/powerjob-agent:$version
+ echo "================== 正在推送 powerjob-mysql 镜像到中央仓库 =================="
+ docker push powerjob/powerjob-mysql:$version
+ echo "================== 正在推送 samples 镜像到中央仓库 =================="
+ docker push powerjob/powerjob-worker-samples:$version
+ echo "================== 双写推送 =================="
+ docker tag tjqq/powerjob-server:$version powerjob/powerjob-server:$version
+ docker push powerjob/powerjob-server:$version
+ docker tag tjqq/powerjob-agent:$version powerjob/powerjob-agent:$version
+ docker push powerjob/powerjob-agent:$version
+ echo "================== 更新 LATEST 版本 =================="
+ docker tag powerjob/powerjob-server:$version powerjob/powerjob-server:latest
+ docker push powerjob/powerjob-server:latest
+ docker tag powerjob/powerjob-agent:$version powerjob/powerjob-agent:latest
+ docker push powerjob/powerjob-agent:latest
+ docker tag powerjob/powerjob-mysql:$version powerjob/powerjob-mysql:latest
+ docker push powerjob/powerjob-mysql:latest
+ docker tag powerjob/powerjob-worker-samples:$version powerjob/powerjob-worker-samples:latest
+ docker push powerjob/powerjob-worker-samples:latest
+ echo "================== Docker 推送完毕 =================="
fi
fi
fi