This commit is contained in:
@@ -296,10 +296,8 @@ public abstract class NodeServer {
|
|||||||
final Set<InetSocketAddress> sg = application.findGlobalGroup(this.sncpGroup);
|
final Set<InetSocketAddress> sg = application.findGlobalGroup(this.sncpGroup);
|
||||||
for (FilterEntry<Service> entry : entrys) { //service实现类
|
for (FilterEntry<Service> entry : entrys) { //service实现类
|
||||||
final Class<? extends Service> type = entry.getType();
|
final Class<? extends Service> type = entry.getType();
|
||||||
if (type.isInterface()) continue;
|
|
||||||
if (Modifier.isFinal(type.getModifiers())) continue;
|
if (Modifier.isFinal(type.getModifiers())) continue;
|
||||||
if (!Modifier.isPublic(type.getModifiers())) continue;
|
if (!Modifier.isPublic(type.getModifiers())) continue;
|
||||||
if (Modifier.isAbstract(type.getModifiers())) continue;
|
|
||||||
if (!isSNCP() && factory.find(entry.getName(), type) != null) continue;
|
if (!isSNCP() && factory.find(entry.getName(), type) != null) continue;
|
||||||
final Set<InetSocketAddress> sameGroupAddrs = new LinkedHashSet<>();
|
final Set<InetSocketAddress> sameGroupAddrs = new LinkedHashSet<>();
|
||||||
final Map<String, Set<InetSocketAddress>> diffGroupAddrs = new HashMap<>();
|
final Map<String, Set<InetSocketAddress>> diffGroupAddrs = new HashMap<>();
|
||||||
@@ -315,9 +313,13 @@ public abstract class NodeServer {
|
|||||||
}
|
}
|
||||||
List<Transport> diffGroupTransports = new ArrayList<>();
|
List<Transport> diffGroupTransports = new ArrayList<>();
|
||||||
diffGroupAddrs.forEach((k, v) -> diffGroupTransports.add(loadTransport(k, server.getProtocol(), v)));
|
diffGroupAddrs.forEach((k, v) -> diffGroupTransports.add(loadTransport(k, server.getProtocol(), v)));
|
||||||
|
final boolean localed = (sameGroupAddrs.isEmpty() && diffGroupAddrs.isEmpty()) || sameGroupAddrs.contains(this.sncpAddress) || type.getAnnotation(LocalService.class) != null;//本地模式
|
||||||
|
if (localed && (type.isInterface() || Modifier.isAbstract(type.getModifiers()))) continue; //本地模式不能实例化接口和抽象类的Service类
|
||||||
|
final ServiceType st = type.getAnnotation(ServiceType.class);
|
||||||
|
final Class<? extends Service> resType = st == null ? type : st.value();
|
||||||
|
if (st != null && (!isSNCP() && factory.find(entry.getName(), resType) != null)) continue;
|
||||||
ServiceWrapper wrapper;
|
ServiceWrapper wrapper;
|
||||||
if ((sameGroupAddrs.isEmpty() && diffGroupAddrs.isEmpty()) || sameGroupAddrs.contains(this.sncpAddress) || type.getAnnotation(LocalService.class) != null) { //本地模式
|
if (localed) { //本地模式
|
||||||
sameGroupAddrs.remove(this.sncpAddress);
|
sameGroupAddrs.remove(this.sncpAddress);
|
||||||
List<Transport> sameGroupTransports = new ArrayList<>();
|
List<Transport> sameGroupTransports = new ArrayList<>();
|
||||||
for (InetSocketAddress iaddr : sameGroupAddrs) {
|
for (InetSocketAddress iaddr : sameGroupAddrs) {
|
||||||
@@ -326,7 +328,7 @@ public abstract class NodeServer {
|
|||||||
sameGroupTransports.add(loadTransport(this.sncpGroup, server.getProtocol(), tset));
|
sameGroupTransports.add(loadTransport(this.sncpGroup, server.getProtocol(), tset));
|
||||||
}
|
}
|
||||||
Service service = Sncp.createLocalService(entry.getName(), getExecutor(), type, this.sncpAddress, groups, sameGroupTransports, diffGroupTransports);
|
Service service = Sncp.createLocalService(entry.getName(), getExecutor(), type, this.sncpAddress, groups, sameGroupTransports, diffGroupTransports);
|
||||||
wrapper = new ServiceWrapper(type, service, this.sncpGroup, entry);
|
wrapper = new ServiceWrapper(resType, service, this.sncpGroup, entry);
|
||||||
if (fine) logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + service);
|
if (fine) logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + service);
|
||||||
} else {
|
} else {
|
||||||
sameGroupAddrs.remove(this.sncpAddress);
|
sameGroupAddrs.remove(this.sncpAddress);
|
||||||
@@ -338,7 +340,7 @@ public abstract class NodeServer {
|
|||||||
});
|
});
|
||||||
if (sameGroupAddrs.isEmpty()) throw new RuntimeException(type.getName() + " has no remote address on group (" + groups + ")");
|
if (sameGroupAddrs.isEmpty()) throw new RuntimeException(type.getName() + " has no remote address on group (" + groups + ")");
|
||||||
Service service = Sncp.createRemoteService(entry.getName(), getExecutor(), type, this.sncpAddress, groups, loadTransport(g.toString(), server.getProtocol(), sameGroupAddrs));
|
Service service = Sncp.createRemoteService(entry.getName(), getExecutor(), type, this.sncpAddress, groups, loadTransport(g.toString(), server.getProtocol(), sameGroupAddrs));
|
||||||
wrapper = new ServiceWrapper(type, service, "", entry);
|
wrapper = new ServiceWrapper(resType, service, "", entry);
|
||||||
if (fine) logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + service);
|
if (fine) logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + service);
|
||||||
}
|
}
|
||||||
if (factory.find(wrapper.getName(), wrapper.getType()) == null) {
|
if (factory.find(wrapper.getName(), wrapper.getType()) == null) {
|
||||||
|
|||||||
@@ -841,8 +841,8 @@ public abstract class Sncp {
|
|||||||
if (serviceClass == null) return null;
|
if (serviceClass == null) return null;
|
||||||
if (!Service.class.isAssignableFrom(serviceClass)) return null;
|
if (!Service.class.isAssignableFrom(serviceClass)) return null;
|
||||||
int mod = serviceClass.getModifiers();
|
int mod = serviceClass.getModifiers();
|
||||||
|
boolean realed = !(java.lang.reflect.Modifier.isAbstract(mod) || serviceClass.isInterface());
|
||||||
if (!java.lang.reflect.Modifier.isPublic(mod)) return null;
|
if (!java.lang.reflect.Modifier.isPublic(mod)) return null;
|
||||||
if (java.lang.reflect.Modifier.isAbstract(mod)) return null;
|
|
||||||
final String supDynName = serviceClass.getName().replace('.', '/');
|
final String supDynName = serviceClass.getName().replace('.', '/');
|
||||||
final String clientName = SncpClient.class.getName().replace('.', '/');
|
final String clientName = SncpClient.class.getName().replace('.', '/');
|
||||||
final String clientDesc = Type.getDescriptor(SncpClient.class);
|
final String clientDesc = Type.getDescriptor(SncpClient.class);
|
||||||
@@ -852,7 +852,7 @@ public abstract class Sncp {
|
|||||||
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
|
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
|
||||||
ClassLoader loader = Sncp.class.getClassLoader();
|
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 + serviceClass.getSimpleName();
|
||||||
final SncpClient client = new SncpClient(name, executor, hash(serviceClass), true, createLocalServiceClass(name, serviceClass), clientAddress, groups);
|
final SncpClient client = new SncpClient(name, executor, hash(serviceClass), true, realed ? createLocalServiceClass(name, serviceClass) : serviceClass, clientAddress, groups);
|
||||||
try {
|
try {
|
||||||
Class newClazz = Class.forName(newDynName.replace('/', '.'));
|
Class newClazz = Class.forName(newDynName.replace('/', '.'));
|
||||||
T rs = (T) newClazz.newInstance();
|
T rs = (T) newClazz.newInstance();
|
||||||
@@ -883,7 +883,7 @@ public abstract class Sncp {
|
|||||||
AsmMethodVisitor mv;
|
AsmMethodVisitor mv;
|
||||||
AnnotationVisitor av0;
|
AnnotationVisitor av0;
|
||||||
|
|
||||||
cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, supDynName, null);
|
cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, serviceClass.isInterface() ? "java/lang/Object" : supDynName, serviceClass.isInterface() ? new String[]{supDynName} : null);
|
||||||
{
|
{
|
||||||
av0 = cw.visitAnnotation("Ljavax/annotation/Resource;", true);
|
av0 = cw.visitAnnotation("Ljavax/annotation/Resource;", true);
|
||||||
av0.visit("name", name);
|
av0.visit("name", name);
|
||||||
@@ -916,7 +916,7 @@ public abstract class Sncp {
|
|||||||
mv = new AsmMethodVisitor(cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null));
|
mv = new AsmMethodVisitor(cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null));
|
||||||
//mv.setDebug(true);
|
//mv.setDebug(true);
|
||||||
mv.visitVarInsn(ALOAD, 0);
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
mv.visitMethodInsn(INVOKESPECIAL, supDynName, "<init>", "()V", false);
|
mv.visitMethodInsn(INVOKESPECIAL, serviceClass.isInterface() ? "java/lang/Object" : supDynName, "<init>", "()V", false);
|
||||||
mv.visitInsn(RETURN);
|
mv.visitInsn(RETURN);
|
||||||
mv.visitMaxs(1, 1);
|
mv.visitMaxs(1, 1);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
|
|||||||
28
src/org/redkale/service/ServiceType.java
Normal file
28
src/org/redkale/service/ServiceType.java
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.redkale.service;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
import static java.lang.annotation.ElementType.TYPE;
|
||||||
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service的资源类型
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 详情见: http://www.redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
@Inherited
|
||||||
|
@Documented
|
||||||
|
@Target({TYPE})
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
public @interface ServiceType {
|
||||||
|
|
||||||
|
Class<? extends Service> value();
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user