diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 7a9ee76e4..24d45aeae 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -292,54 +292,54 @@ public abstract class NodeServer { ResourceFactory regFactory = isSNCP() ? application.getResourceFactory() : resourceFactory; for (FilterEntry entry : entrys) { //service实现类 - final Class type = entry.getType(); - if (Modifier.isFinal(type.getModifiers())) continue; //修饰final的类跳过 - if (!Modifier.isPublic(type.getModifiers())) continue; + final Class serviceImplClass = entry.getType(); + if (Modifier.isFinal(serviceImplClass.getModifiers())) continue; //修饰final的类跳过 + if (!Modifier.isPublic(serviceImplClass.getModifiers())) continue; if (entry.isExpect()) { - if (Modifier.isAbstract(type.getModifiers())) continue; //修饰abstract的类跳过 - if (DataSource.class.isAssignableFrom(type)) continue; - if (CacheSource.class.isAssignableFrom(type)) continue; - if (DataCacheListener.class.isAssignableFrom(type)) continue; - if (WebSocketNode.class.isAssignableFrom(type)) continue; + if (Modifier.isAbstract(serviceImplClass.getModifiers())) continue; //修饰abstract的类跳过 + if (DataSource.class.isAssignableFrom(serviceImplClass)) continue; + if (CacheSource.class.isAssignableFrom(serviceImplClass)) continue; + if (DataCacheListener.class.isAssignableFrom(serviceImplClass)) continue; + if (WebSocketNode.class.isAssignableFrom(serviceImplClass)) continue; } if (entry.getName().contains("$")) throw new RuntimeException(" value cannot contains '$' in " + entry.getProperty()); - Service oldother = resourceFactory.find(entry.getName(), type); + Service oldother = resourceFactory.find(entry.getName(), serviceImplClass); if (oldother != null) { //Server加载Service时需要判断是否已经加载过了。 - interceptorServiceWrappers.add(new NodeInterceptor.InterceptorServiceWrapper(entry.getName(), type, oldother)); + interceptorServiceWrappers.add(new NodeInterceptor.InterceptorServiceWrapper(entry.getName(), serviceImplClass, oldother)); continue; } final HashSet groups = entry.getGroups(); //groups.isEmpty()表示没有配置groups属性。 if (groups.isEmpty() && isSNCP() && this.sncpGroup != null) groups.add(this.sncpGroup); - final boolean localed = (this.sncpAddress == null && entry.isEmptyGroups() && !type.isInterface() && !Modifier.isAbstract(type.getModifiers())) //非SNCP的Server,通常是单点服务 + final boolean localed = (this.sncpAddress == null && entry.isEmptyGroups() && !serviceImplClass.isInterface() && !Modifier.isAbstract(serviceImplClass.getModifiers())) //非SNCP的Server,通常是单点服务 || groups.contains(this.sncpGroup) //本地IP含在内的 || (this.sncpGroup == null && entry.isEmptyGroups()) //空的SNCP配置 - || type.getAnnotation(LocalService.class) != null;//本地模式 - if (localed && (type.isInterface() || Modifier.isAbstract(type.getModifiers()))) continue; //本地模式不能实例化接口和抽象类的Service类 + || serviceImplClass.getAnnotation(LocalService.class) != null;//本地模式 + if (localed && (serviceImplClass.isInterface() || Modifier.isAbstract(serviceImplClass.getModifiers()))) continue; //本地模式不能实例化接口和抽象类的Service类 final BiConsumer runner = (ResourceFactory rf, Boolean needinject) -> { try { Service service; if (localed) { //本地模式 - service = Sncp.createLocalService(entry.getName(), getExecutor(), application.getResourceFactory(), type, + service = Sncp.createLocalService(entry.getName(), getExecutor(), application.getResourceFactory(), serviceImplClass, NodeServer.this.sncpAddress, loadTransport(NodeServer.this.sncpGroup), loadTransports(groups)); } else { - service = Sncp.createRemoteService(entry.getName(), getExecutor(), type, NodeServer.this.sncpAddress, loadTransport(groups)); + service = Sncp.createRemoteService(entry.getName(), getExecutor(), serviceImplClass, NodeServer.this.sncpAddress, loadTransport(groups)); } - if (SncpClient.parseMethod(type).isEmpty()) return; //class没有可用的方法, 通常为BaseService - final ServiceWrapper wrapper = new ServiceWrapper(type, service, entry.getName(), localed ? NodeServer.this.sncpGroup : null, groups, entry.getProperty()); + if (SncpClient.parseMethod(serviceImplClass).isEmpty()) return; //class没有可用的方法, 通常为BaseService + final ServiceWrapper wrapper = new ServiceWrapper(serviceImplClass, service, entry.getName(), localed ? NodeServer.this.sncpGroup : null, groups, entry.getProperty()); for (final Class restype : wrapper.getTypes()) { if (resourceFactory.find(wrapper.getName(), restype) == null) { regFactory.register(wrapper.getName(), restype, wrapper.getService()); if (needinject) rf.inject(wrapper.getService()); //动态加载的Service也存在按需加载的注入资源 } else if (isSNCP() && !entry.isAutoload()) { - throw new RuntimeException(ServiceWrapper.class.getSimpleName() + "(class:" + type.getName() + ", name:" + entry.getName() + ", group:" + groups + ") is repeat."); + throw new RuntimeException(ServiceWrapper.class.getSimpleName() + "(class:" + serviceImplClass.getName() + ", name:" + entry.getName() + ", group:" + groups + ") is repeat."); } } if (wrapper.isRemote()) { remoteServiceWrappers.add(wrapper); } else { localServiceWrappers.add(wrapper); - interceptorServiceWrappers.add(new NodeInterceptor.InterceptorServiceWrapper(entry.getName(), type, service)); + interceptorServiceWrappers.add(new NodeInterceptor.InterceptorServiceWrapper(entry.getName(), serviceImplClass, service)); if (consumer != null) consumer.accept(wrapper); } } catch (RuntimeException ex) { diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index d7ec1959e..e8fe34e16 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -770,7 +770,7 @@ public abstract class Sncp { * @param name 资源名 * @param executor 线程池 * @param resourceFactory 资源容器 - * @param serviceClass Service类 + * @param serviceImplClass Service类 * @param clientAddress 本地IP地址 * @param sameGroupTransport 同组的通信组件 * @param diffGroupTransports 异组的通信组件列表 @@ -779,9 +779,9 @@ public abstract class Sncp { */ @SuppressWarnings("unchecked") public static T createLocalService(final String name, final Consumer executor, final ResourceFactory resourceFactory, - final Class serviceClass, final InetSocketAddress clientAddress, final Transport sameGroupTransport, final Collection diffGroupTransports) { + final Class serviceImplClass, final InetSocketAddress clientAddress, final Transport sameGroupTransport, final Collection diffGroupTransports) { try { - final Class newClazz = createLocalServiceClass(name, serviceClass); + final Class newClazz = createLocalServiceClass(name, serviceImplClass); T rs = (T) newClazz.newInstance(); //-------------------------------------- Service remoteService = null; @@ -813,7 +813,7 @@ public abstract class Sncp { } } if (remoteService == null && remoteTransport != null) { - remoteService = createRemoteService(name, executor, serviceClass, clientAddress, remoteTransport); + remoteService = createRemoteService(name, executor, serviceImplClass, clientAddress, remoteTransport); } if (remoteService != null) field.set(rs, remoteService); } @@ -824,7 +824,7 @@ public abstract class Sncp { try { Field e = newClazz.getDeclaredField(FIELDPREFIX + "_client"); e.setAccessible(true); - client = new SncpClient(name, serviceClass, rs, executor, false, newClazz, clientAddress); + client = new SncpClient(name, serviceImplClass, rs, executor, false, newClazz, clientAddress); e.set(rs, client); } catch (NoSuchFieldException ne) { } @@ -937,21 +937,21 @@ public abstract class Sncp { * @param Service泛型 * @param name 资源名 * @param executor 线程池 - * @param serviceClass Service类 + * @param serviceTypeOrImplClass Service类 * @param clientAddress 本地IP地址 * @param transport 通信组件 * * @return Service的远程模式实例 */ @SuppressWarnings("unchecked") - public static T createRemoteService(final String name, final Consumer executor, final Class serviceClass, + public static T createRemoteService(final String name, final Consumer executor, final Class serviceTypeOrImplClass, final InetSocketAddress clientAddress, final Transport transport) { - if (serviceClass == null) return null; - if (!Service.class.isAssignableFrom(serviceClass)) return null; - int mod = serviceClass.getModifiers(); - boolean realed = !(java.lang.reflect.Modifier.isAbstract(mod) || serviceClass.isInterface()); + if (serviceTypeOrImplClass == null) return null; + if (!Service.class.isAssignableFrom(serviceTypeOrImplClass)) return null; + int mod = serviceTypeOrImplClass.getModifiers(); + boolean realed = !(java.lang.reflect.Modifier.isAbstract(mod) || serviceTypeOrImplClass.isInterface()); if (!java.lang.reflect.Modifier.isPublic(mod)) return null; - final String supDynName = serviceClass.getName().replace('.', '/'); + final String supDynName = serviceTypeOrImplClass.getName().replace('.', '/'); final String clientName = SncpClient.class.getName().replace('.', '/'); final String clientDesc = Type.getDescriptor(SncpClient.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); @@ -960,11 +960,11 @@ public abstract class Sncp { final String transportDesc = Type.getDescriptor(Transport.class); final String anyValueDesc = Type.getDescriptor(AnyValue.class); ClassLoader loader = Sncp.class.getClassLoader(); - String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + REMOTEPREFIX + serviceClass.getSimpleName(); + String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + REMOTEPREFIX + serviceTypeOrImplClass.getSimpleName(); try { Class newClazz = Class.forName(newDynName.replace('/', '.')); T rs = (T) newClazz.newInstance(); - SncpClient client = new SncpClient(name, serviceClass, rs, executor, true, realed ? createLocalServiceClass(name, serviceClass) : serviceClass, clientAddress); + SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, executor, true, realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress); Field c = newClazz.getDeclaredField(FIELDPREFIX + "_client"); c.setAccessible(true); c.set(rs, client); @@ -993,7 +993,7 @@ public abstract class Sncp { AsmMethodVisitor mv; AnnotationVisitor av0; - cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, serviceClass.isInterface() ? "java/lang/Object" : supDynName, serviceClass.isInterface() ? new String[]{supDynName} : null); + cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, serviceTypeOrImplClass.isInterface() ? "java/lang/Object" : supDynName, serviceTypeOrImplClass.isInterface() ? new String[]{supDynName} : null); { av0 = cw.visitAnnotation("Ljavax/annotation/Resource;", true); av0.visit("name", name); @@ -1003,9 +1003,9 @@ public abstract class Sncp { av0 = cw.visitAnnotation(Type.getDescriptor(ResourceType.class), true); { AnnotationVisitor av1 = av0.visitArray("value"); - ResourceType rty = serviceClass.getAnnotation(ResourceType.class); + ResourceType rty = serviceTypeOrImplClass.getAnnotation(ResourceType.class); if (rty == null) { - av1.visit(null, Type.getType(Type.getDescriptor(serviceClass))); + av1.visit(null, Type.getType(Type.getDescriptor(serviceTypeOrImplClass))); } else { for (Class cl : rty.value()) { av1.visit(null, Type.getType(Type.getDescriptor(cl))); @@ -1021,7 +1021,7 @@ public abstract class Sncp { av0.visitEnd(); } { //给新类加上 原有的Annotation - for (Annotation ann : serviceClass.getAnnotations()) { + for (Annotation ann : serviceTypeOrImplClass.getAnnotations()) { if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) continue; visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann); } @@ -1054,7 +1054,7 @@ public abstract class Sncp { mv = new AsmMethodVisitor(cw.visitMethod(ACC_PUBLIC, "", "()V", null, null)); //mv.setDebug(true); mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESPECIAL, serviceClass.isInterface() ? "java/lang/Object" : supDynName, "", "()V", false); + mv.visitMethodInsn(INVOKESPECIAL, serviceTypeOrImplClass.isInterface() ? "java/lang/Object" : supDynName, "", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); @@ -1090,7 +1090,7 @@ public abstract class Sncp { mv.visitEnd(); } int i = -1; - for (final SncpAction entry : SncpClient.getSncpActions(realed ? createLocalServiceClass(name, serviceClass) : serviceClass)) { + for (final SncpAction entry : SncpClient.getSncpActions(realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass)) { final int index = ++i; final java.lang.reflect.Method method = entry.method; { @@ -1201,7 +1201,7 @@ public abstract class Sncp { T rs = (T) newClazz.newInstance(); Field c = newClazz.getDeclaredField(FIELDPREFIX + "_client"); c.setAccessible(true); - SncpClient client = new SncpClient(name, serviceClass, rs, executor, true, realed ? createLocalServiceClass(name, serviceClass) : serviceClass, clientAddress); + SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, executor, true, realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress); c.set(rs, client); Field t = newClazz.getDeclaredField(FIELDPREFIX + "_transport"); t.setAccessible(true);