From 79cde85256b3b0ad154fa36a15141385b83d48f2 Mon Sep 17 00:00:00 2001 From: tjq Date: Fri, 6 Jan 2023 22:53:11 +0800 Subject: [PATCH] feat: define PowerJobActor --- .../remote/framework/actor/PowerJobActor.java | 10 ++++++ .../remote/framework/engine/EngineConfig.java | 6 ++++ .../framework/engine/impl/ActorFactory.java | 31 +++++++++---------- .../engine/impl/PowerJobRemoteEngine.java | 2 +- .../engine/impl/ActorFactoryTest.java | 9 ++---- .../remote/framework/test/TestActor.java | 14 ++++++++- 6 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/PowerJobActor.java diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/PowerJobActor.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/PowerJobActor.java new file mode 100644 index 00000000..3d0b757b --- /dev/null +++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/actor/PowerJobActor.java @@ -0,0 +1,10 @@ +package tech.powerjob.remote.framework.actor; + +/** + * 方便后续扩展,比如启动回调等 + * + * @author tjq + * @since 2023/1/6 + */ +public interface PowerJobActor { +} 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 4120f7ea..6c22b99e 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 @@ -4,10 +4,12 @@ import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import tech.powerjob.remote.framework.actor.PowerJobActor; import tech.powerjob.remote.framework.base.Address; import tech.powerjob.remote.framework.base.ServerType; import java.io.Serializable; +import java.util.List; import java.util.Set; /** @@ -29,4 +31,8 @@ public class EngineConfig implements Serializable { * 绑定的本地地址 */ private Address bindAddress; + /** + * actor实例,交由使用侧自己实例化以便自行注入各种 bean + */ + private List actorList; } 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 b9c84902..656b71b3 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,14 +2,13 @@ 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.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.common.exception.PowerJobException; +import tech.powerjob.remote.framework.actor.*; import tech.powerjob.remote.framework.base.HandlerLocation; import java.lang.reflect.Method; @@ -25,19 +24,16 @@ import java.util.Set; @Slf4j class ActorFactory { - static List load() { - Reflections reflections = new Reflections(OmsConstant.PACKAGE); - final Set> typesAnnotatedWith = reflections.getTypesAnnotatedWith(Actor.class); + static List load(List actorList) { List actorInfos = Lists.newArrayList(); - typesAnnotatedWith.forEach(clz -> { + + actorList.forEach(actor -> { + final Class clz = actor.getClass(); 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()); - - ActorInfo actorInfo = new ActorInfo().setActor(object).setAnno(anno); + ActorInfo actorInfo = new ActorInfo().setActor(actor).setAnno(anno); actorInfo.setHandlerInfos(loadHandlerInfos4Actor(actorInfo)); actorInfos.add(actorInfo); @@ -56,21 +52,24 @@ class ActorFactory { 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 -> { + + Method[] declaredMethods = actor.getClass().getDeclaredMethods(); + for (Method handlerMethod: declaredMethods) { Handler handlerMethodAnnotation = handlerMethod.getAnnotation(Handler.class); + if (handlerMethodAnnotation == null) { + continue; + } HandlerLocation handlerLocation = new HandlerLocation() .setRootPath(rootPath) .setMethodPath(handlerMethodAnnotation.path()); - HandlerInfo handlerInfo = new HandlerInfo() .setAnno(handlerMethodAnnotation) .setMethod(handlerMethod) .setLocation(handlerLocation); ret.add(handlerInfo); - }); + } return ret; } } 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 0713b72e..5d69ee98 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,7 +27,7 @@ public class PowerJobRemoteEngine implements RemoteEngine { EngineOutput engineOutput = new EngineOutput(); log.info("[PowerJobRemoteEngine] start remote engine with config: {}", engineConfig); - List actorInfos = ActorFactory.load(); + List actorInfos = ActorFactory.load(engineConfig.getActorList()); List csInitializerList = CSInitializerFactory.build(engineConfig.getTypes()); csInitializerList.forEach(csInitializer -> { diff --git a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/ActorFactoryTest.java b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/ActorFactoryTest.java index 7ec58e42..514d8e19 100644 --- a/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/ActorFactoryTest.java +++ b/powerjob-remote/powerjob-remote-framework/src/test/java/tech/powerjob/remote/framework/engine/impl/ActorFactoryTest.java @@ -1,5 +1,6 @@ package tech.powerjob.remote.framework.engine.impl; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import tech.powerjob.remote.framework.actor.ActorInfo; @@ -20,13 +21,7 @@ class ActorFactoryTest { @Test void load() { - final List actorInfos = ActorFactory.load(); - log.info("[ActorFactoryTest] actorInfos: {}", actorInfos); - - final Set clzNames = actorInfos.stream().map(x -> x.getActor().getClass().getName()).collect(Collectors.toSet()); - log.info("[ActorFactoryTest] all load clzNames: {}", clzNames); - - assert clzNames.contains(TestActor.class.getName()); + ActorFactory.load(Lists.newArrayList(new TestActor())); } } \ 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 index 189e41cf..b2d82ec0 100644 --- 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 @@ -1,7 +1,11 @@ package tech.powerjob.remote.framework.test; +import lombok.extern.slf4j.Slf4j; import tech.powerjob.remote.framework.actor.Actor; import tech.powerjob.remote.framework.actor.Handler; +import tech.powerjob.remote.framework.actor.PowerJobActor; + +import java.util.Map; /** * TestActor @@ -9,8 +13,9 @@ import tech.powerjob.remote.framework.actor.Handler; * @author tjq * @since 2022/12/31 */ +@Slf4j @Actor(path = "/test") -public class TestActor { +public class TestActor implements PowerJobActor { public static void simpleStaticMethod() { } @@ -20,12 +25,19 @@ public class TestActor { @Handler(path = "/method1") public String handlerMethod1() { + log.info("[TestActor] handlerMethod1"); return "1"; } @Handler(path = "/method2") public String handlerMethod2(String name) { + log.info("[TestActor] handlerMethod2 req: {}", name); return name; } + @Handler(path = "/returnEmpty") + public void handlerEmpty(Map req) { + log.info("[TestActor] handlerEmpty req: {}", req); + } + }