From ea6c703ac6a194bebdd06793d98d5838df4397a7 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Wed, 7 Jun 2017 07:02:16 +0800 Subject: [PATCH] --- src/org/redkale/boot/NodeHttpServer.java | 10 +++--- src/org/redkale/boot/NodeServer.java | 42 +++++++++++++----------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index cad69b976..24fe3931c 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -109,7 +109,7 @@ public class NodeHttpServer extends NodeServer { synchronized (regFactory) { Service nodeService = (Service) rf.find(resourceName, WebSocketNode.class); if (nodeService == null) { - nodeService = Sncp.createLocalService(classLoader, resourceName, WebSocketNodeService.class, application.getResourceFactory(), application.getTransportFactory(), (InetSocketAddress) null, (Set) null, (AnyValue) null); + nodeService = Sncp.createLocalService(serverClassLoader, resourceName, WebSocketNodeService.class, application.getResourceFactory(), application.getTransportFactory(), (InetSocketAddress) null, (Set) null, (AnyValue) null); regFactory.register(resourceName, WebSocketNode.class, nodeService); } resourceFactory.inject(nodeService, self); @@ -210,9 +210,9 @@ public class NodeHttpServer extends NodeServer { final boolean autoload = restConf.getBoolValue("autoload", true); { //加载RestService String userTypeStr = restConf.getValue("usertype"); - final Class userType = userTypeStr == null ? null : this.classLoader.loadClass(userTypeStr); + final Class userType = userTypeStr == null ? null : this.serverClassLoader.loadClass(userTypeStr); - final Class baseServletType = this.classLoader.loadClass(restConf.getValue("base", HttpServlet.class.getName())); + final Class baseServletType = this.serverClassLoader.loadClass(restConf.getValue("base", HttpServlet.class.getName())); final Set includeValues = new HashSet<>(); final Set excludeValues = new HashSet<>(); for (AnyValue item : restConf.getAnyValues("service")) { @@ -239,7 +239,7 @@ public class NodeHttpServer extends NodeServer { return; } restedObjects.add(service); //避免重复创建Rest对象 - HttpServlet servlet = httpServer.addRestServlet(classLoader, service, userType, baseServletType, prefix); + HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix); if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null resourceFactory.inject(servlet, NodeHttpServer.this); if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet); @@ -289,7 +289,7 @@ public class NodeHttpServer extends NodeServer { return; } restedObjects.add(stype); //避免重复创建Rest对象 - HttpServlet servlet = httpServer.addRestWebSocketServlet(classLoader, stype, prefix, en.getProperty()); + HttpServlet servlet = httpServer.addRestWebSocketServlet(serverClassLoader, stype, prefix, en.getProperty()); if (servlet == null) return; //没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null resourceFactory.inject(servlet, NodeHttpServer.this); if (finest) logger.finest(threadName + " " + stype.getName() + " create RestWebSocketServlet " + servlet); diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 539636390..41f57bd76 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -55,7 +55,9 @@ public abstract class NodeServer { protected final Server server; //ClassLoader - protected RedkaleClassLoader classLoader; + protected RedkaleClassLoader serverClassLoader; + + protected final Thread serverThread; //当前Server的SNCP协议的组 protected String sncpGroup = null; @@ -90,8 +92,9 @@ public abstract class NodeServer { this.resourceFactory = application.getResourceFactory().createChild(); this.server = server; this.logger = Logger.getLogger(this.getClass().getSimpleName()); - this.classLoader = new RedkaleClassLoader(application.getServerClassLoader()); - Thread.currentThread().setContextClassLoader(this.classLoader); + this.serverClassLoader = new RedkaleClassLoader(application.getServerClassLoader()); + Thread.currentThread().setContextClassLoader(this.serverClassLoader); + this.serverThread = Thread.currentThread(); } public static NodeServer create(Class clazz, Application application, AnyValue serconf) { @@ -131,8 +134,8 @@ public abstract class NodeServer { resourceFactory.register(Server.RESNAME_SERVER_ROOT, Path.class, myroot.toPath()); //加入指定的classpath - Server.loadLib(classLoader, logger, this.serverConf.getValue("lib", "${APP_HOME}/libs/*").replace("${APP_HOME}", application.getHome().getPath().replace('\\', '/'))); - Thread.currentThread().setContextClassLoader(this.classLoader); + Server.loadLib(serverClassLoader, logger, this.serverConf.getValue("lib", "${APP_HOME}/libs/*").replace("${APP_HOME}", application.getHome().getPath().replace('\\', '/'))); + this.serverThread.setContextClassLoader(this.serverClassLoader); } //必须要进行初始化, 构建Service时需要使用Context中的ExecutorService server.init(this.serverConf); @@ -140,7 +143,7 @@ public abstract class NodeServer { initResource(); //给 DataSource、CacheSource 注册依赖注入时的监听回调事件。 String interceptorClass = this.serverConf.getValue("interceptor", ""); if (!interceptorClass.isEmpty()) { - Class clazz = classLoader.loadClass(interceptorClass); + Class clazz = serverClassLoader.loadClass(interceptorClass); this.interceptor = (NodeInterceptor) clazz.newInstance(); } @@ -174,7 +177,7 @@ public abstract class NodeServer { if (resources != null) { for (AnyValue sourceConf : resources.getAnyValues("source")) { try { - Class type = classLoader.loadClass(sourceConf.getValue("value")); + Class type = serverClassLoader.loadClass(sourceConf.getValue("value")); if (!Service.class.isAssignableFrom(type)) { logger.log(Level.SEVERE, "load application source resource, but not Service error: " + sourceConf); } else if (CacheSource.class.isAssignableFrom(type)) { @@ -230,7 +233,7 @@ public abstract class NodeServer { final Set groups = new HashSet<>(); if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup()); if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups()); - Service cacheListenerService = Sncp.createLocalService(classLoader, resourceName, DataCacheListenerService.class, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf((Service) src)); + Service cacheListenerService = Sncp.createLocalService(serverClassLoader, resourceName, DataCacheListenerService.class, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf((Service) src)); appResFactory.register(resourceName, DataCacheListener.class, cacheListenerService); localServices.add(cacheListenerService); sncpServer.consumerAccept(cacheListenerService); @@ -256,11 +259,11 @@ public abstract class NodeServer { SncpClient client = Sncp.getSncpClient(srcService); final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress(); final AnyValue sourceConf = cacheResource.get(resourceName); - final Class sourceType = sourceConf == null ? CacheMemorySource.class : classLoader.loadClass(sourceConf.getValue("type")); + final Class sourceType = sourceConf == null ? CacheMemorySource.class : serverClassLoader.loadClass(sourceConf.getValue("type")); final Set groups = new HashSet<>(); if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup()); if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups()); - final CacheSource source = (CacheSource) Sncp.createLocalService(classLoader, resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService)); + final CacheSource source = (CacheSource) Sncp.createLocalService(serverClassLoader, resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService)); Type genericType = field.getGenericType(); ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null; Type valType = pt == null ? null : pt.getActualTypeArguments()[1]; @@ -331,9 +334,9 @@ public abstract class NodeServer { Service service; boolean ws = src instanceof WebSocketServlet; if (ws || localed) { //本地模式 - service = Sncp.createLocalService(classLoader, resourceName, serviceImplClass, appResourceFactory, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); + service = Sncp.createLocalService(serverClassLoader, resourceName, serviceImplClass, appResourceFactory, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); } else { - service = Sncp.createRemoteService(classLoader, resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); + service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); } if (SncpClient.parseMethod(serviceImplClass).isEmpty()) return; //class没有可用的方法, 通常为BaseService @@ -437,7 +440,7 @@ public abstract class NodeServer { protected ClassFilter createClassFilter(final String localGroup, Class ref, Class inter, Class[] excludeSuperClasses, Class ref2, String properties, String property) { - ClassFilter cf = new ClassFilter(this.classLoader, ref, inter, excludeSuperClasses, null); + ClassFilter cf = new ClassFilter(this.serverClassLoader, ref, inter, excludeSuperClasses, null); if (properties == null && properties == null) { cf.setRefused(true); return cf; @@ -464,7 +467,7 @@ public abstract class NodeServer { prop = new AnyValue.DefaultAnyValue(); prop.addValue("groups", sc); } - ClassFilter filter = new ClassFilter(this.classLoader, ref, inter, excludeSuperClasses, prop); + ClassFilter filter = new ClassFilter(this.serverClassLoader, ref, inter, excludeSuperClasses, prop); for (AnyValue av : list.getAnyValues(property)) { // 节点 final AnyValue[] items = av.getAnyValues("property"); if (av instanceof DefaultAnyValue && items.length > 0) { //存在 节点 @@ -521,13 +524,14 @@ public abstract class NodeServer { return resourceFactory; } - public RedkaleClassLoader getClassLoader() { - return classLoader; + public RedkaleClassLoader getServerClassLoader() { + return serverClassLoader; } - public void setClassLoader(RedkaleClassLoader classLoader) { - Objects.requireNonNull(this.classLoader); - this.classLoader = classLoader; + public void setServerClassLoader(RedkaleClassLoader serverClassLoader) { + Objects.requireNonNull(this.serverClassLoader); + this.serverClassLoader = serverClassLoader; + this.serverThread.setContextClassLoader(serverClassLoader); } public InetSocketAddress getSncpAddress() {