From cb444be0f78f4e91d92774529c1ae3cbee6fe230 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Tue, 8 Jan 2019 12:32:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Application.singleton?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/boot/Application.java | 4 +++- src/org/redkale/boot/ClassFilter.java | 13 ++++++++++++- src/org/redkale/boot/NodeServer.java | 16 +++++++++++++--- src/org/redkale/boot/NodeSncpServer.java | 2 +- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index 6591872b2..19592084f 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -135,7 +135,7 @@ public final class Application { //-------------------------------------------------------------------------------------------- //是否用于main方法运行 - private final boolean singletonrun; + final boolean singletonrun; //根WatchFactory //private final WatchFactory watchFactory = WatchFactory.root(); @@ -672,6 +672,7 @@ public final class Application { final List others = new ArrayList<>(); final List watchs = new ArrayList<>(); for (final AnyValue entry : entrys) { + if (singletonrun) ((DefaultAnyValue) entry).setValue("red" + "kale-singleton-serviceclass", config.getValue("red" + "kale-singleton-serviceclass")); if (entry.getValue("protocol", "").toUpperCase().startsWith("SNCP")) { sncps.add(entry); } else if (entry.getValue("protocol", "").toUpperCase().startsWith("WATCH")) { @@ -819,6 +820,7 @@ public final class Application { public static T singleton(String name, Class serviceClass) throws Exception { if (serviceClass == null) throw new IllegalArgumentException("serviceClass is null"); final Application application = Application.create(true); + ((DefaultAnyValue) application.config).setValue("red" + "kale-singleton-serviceclass", serviceClass.getName()); application.init(); application.start(); for (NodeServer server : application.servers) { diff --git a/src/org/redkale/boot/ClassFilter.java b/src/org/redkale/boot/ClassFilter.java index 0f45b72f9..d507c5ca8 100644 --- a/src/org/redkale/boot/ClassFilter.java +++ b/src/org/redkale/boot/ClassFilter.java @@ -11,6 +11,7 @@ import java.lang.reflect.Modifier; import java.net.*; import java.util.*; import java.util.concurrent.*; +import java.util.function.Predicate; import java.util.jar.*; import java.util.logging.*; import java.util.regex.*; @@ -36,6 +37,8 @@ public final class ClassFilter { private final Set> expectEntrys = new HashSet<>(); //准备符合条件的结果 + private Predicate expectPredicate; + private boolean refused; //是否拒绝所有数据,设置true,则其他规则失效,都是拒绝. private Class superClass; //符合的父类型。不为空时,扫描结果的class必须是superClass的子类 @@ -196,7 +199,7 @@ public final class ClassFilter { } AutoLoad auto = (AutoLoad) clazz.getAnnotation(AutoLoad.class); - if (autoscan && auto != null && !auto.value()) { //自动扫描且被标记为@AutoLoad(false)的 + if ((expectPredicate != null && expectPredicate.test(clazzname)) || (autoscan && auto != null && !auto.value())) { //自动扫描且被标记为@AutoLoad(false)的 expectEntrys.add(new FilterEntry(clazz, autoscan, true, property)); } else { entrys.add(new FilterEntry(clazz, autoscan, false, property)); @@ -347,6 +350,14 @@ public final class ClassFilter { this.refused = refused; } + public Predicate getExpectPredicate() { + return expectPredicate; + } + + public void setExpectPredicate(Predicate predicate) { + this.expectPredicate = predicate; + } + public Set getPrivilegeIncludes() { return privilegeIncludes; } diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index b6f649264..26f71dab7 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -154,17 +154,27 @@ public abstract class NodeServer { } ClassFilter serviceFilter = createServiceClassFilter(); + if (application.singletonrun) { + final String ssc = config == null ? null : config.getValue("red" + "kale-singleton-serviceclass"); + if (ssc != null) serviceFilter.setExpectPredicate(c -> !ssc.equals(c)); + } ClassFilter filterFilter = createFilterClassFilter(); ClassFilter servletFilter = createServletClassFilter(); ClassFilter otherFilter = createOtherClassFilter(); + if (application.singletonrun) { + if (filterFilter != null) filterFilter.setRefused(true); + if (servletFilter != null) servletFilter.setRefused(true); + if (otherFilter != null) otherFilter.setRefused(true); + } long s = System.currentTimeMillis(); ClassFilter.Loader.load(application.getHome(), serverConf.getValue("excludelibs", "").split(";"), serviceFilter, filterFilter, servletFilter, otherFilter); long e = System.currentTimeMillis() - s; logger.info(this.getClass().getSimpleName() + " load filter class in " + e + " ms"); loadService(serviceFilter, otherFilter); //必须在servlet之前 - loadFilter(filterFilter, otherFilter); - loadServlet(servletFilter, otherFilter); - + if (!application.singletonrun) { + loadFilter(filterFilter, otherFilter); + loadServlet(servletFilter, otherFilter); + } if (this.interceptor != null) this.resourceFactory.inject(this.interceptor); } diff --git a/src/org/redkale/boot/NodeSncpServer.java b/src/org/redkale/boot/NodeSncpServer.java index b11a9817c..822f8c19e 100644 --- a/src/org/redkale/boot/NodeSncpServer.java +++ b/src/org/redkale/boot/NodeSncpServer.java @@ -32,7 +32,7 @@ public class NodeSncpServer extends NodeServer { private NodeSncpServer(Application application, AnyValue serconf) { super(application, createServer(application, serconf)); this.sncpServer = (SncpServer) this.server; - this.consumer = sncpServer == null ? null : x -> sncpServer.addSncpServlet(x); + this.consumer = sncpServer == null || application.singletonrun ? null : x -> sncpServer.addSncpServlet(x); //singleton模式下不生成SncpServlet } public static NodeServer createNodeServer(Application application, AnyValue serconf) {