优化Application.singleton方法

This commit is contained in:
Redkale
2019-01-08 12:32:47 +08:00
parent 8b5cbf186f
commit cb444be0f7
4 changed files with 29 additions and 6 deletions

View File

@@ -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<AnyValue> others = new ArrayList<>();
final List<AnyValue> 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 extends Service> T singleton(String name, Class<T> 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) {

View File

@@ -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<T> {
private final Set<FilterEntry<T>> expectEntrys = new HashSet<>(); //准备符合条件的结果
private Predicate<String> expectPredicate;
private boolean refused; //是否拒绝所有数据,设置true则其他规则失效,都是拒绝.
private Class superClass; //符合的父类型。不为空时扫描结果的class必须是superClass的子类
@@ -196,7 +199,7 @@ public final class ClassFilter<T> {
}
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<T> {
this.refused = refused;
}
public Predicate<String> getExpectPredicate() {
return expectPredicate;
}
public void setExpectPredicate(Predicate<String> predicate) {
this.expectPredicate = predicate;
}
public Set<String> getPrivilegeIncludes() {
return privilegeIncludes;
}

View File

@@ -154,17 +154,27 @@ public abstract class NodeServer {
}
ClassFilter<Service> 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<Filter> filterFilter = createFilterClassFilter();
ClassFilter<Servlet> 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);
}

View File

@@ -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) {