diff --git a/src/main/java/org/redkale/mq/MessageAgent.java b/src/main/java/org/redkale/mq/MessageAgent.java index 1aa62ba69..5296e127e 100644 --- a/src/main/java/org/redkale/mq/MessageAgent.java +++ b/src/main/java/org/redkale/mq/MessageAgent.java @@ -347,12 +347,15 @@ public abstract class MessageAgent implements Resourcable { //格式: sncp.req.user public final String generateSncpReqTopic(Service service) { - if (service instanceof WebSocketNode) { - String resname = Sncp.getResourceName(service); - return "sncp.req.ws" + (resname.isEmpty() ? "" : ("-" + resname)) + ".node" + nodeid; + return generateSncpReqTopic(Sncp.getResourceName(service), Sncp.getResourceType(service)); + } + + //格式: sncp.req.user + public final String generateSncpReqTopic(String resourceName, Class resourceType) { + if (WebSocketNode.class.isAssignableFrom(resourceType)) { + return "sncp.req.ws" + (resourceName.isEmpty() ? "" : ("-" + resourceName)) + ".node" + nodeid; } - String resname = Sncp.getResourceName(service); - return "sncp.req." + Sncp.getResourceType(service).getSimpleName().replaceAll("Service.*$", "").toLowerCase() + (resname.isEmpty() ? "" : ("-" + resname)); + return "sncp.req." + resourceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase() + (resourceName.isEmpty() ? "" : ("-" + resourceName)); } //格式: consumer-sncp.req.user 不提供外部使用 diff --git a/src/main/java/org/redkale/net/sncp/Sncp.java b/src/main/java/org/redkale/net/sncp/Sncp.java index 8bde8bbe4..2e0698e06 100644 --- a/src/main/java/org/redkale/net/sncp/Sncp.java +++ b/src/main/java/org/redkale/net/sncp/Sncp.java @@ -151,8 +151,8 @@ public abstract class Sncp { } public static SncpServiceInfo createSncpServiceInfo(String resourceName, - Class resourceServiceType, T service, Convert convert, SncpClient sncpClient, MessageAgent messageAgent, SncpMessageClient messageClient) { - return new SncpServiceInfo(resourceName, resourceServiceType, service, convert, sncpClient, messageAgent, messageClient); + Class resourceServiceType, Class serviceImplClass, Convert convert, SncpClient sncpClient, MessageAgent messageAgent, SncpMessageClient messageClient) { + return new SncpServiceInfo(resourceName, resourceServiceType, serviceImplClass, convert, sncpClient, messageAgent, messageClient); } public static Uint128 actionid(final RpcAction action) { @@ -268,11 +268,11 @@ public abstract class Sncp { return null; } try { - Field ts = service.getClass().getDeclaredField(FIELDPREFIX + "_messageagent"); + Field ts = service.getClass().getDeclaredField(FIELDPREFIX + "_messageAgent"); ts.setAccessible(true); return (MessageAgent) ts.get(service); } catch (Exception e) { - throw new SncpException(service + " not found " + FIELDPREFIX + "_messageagent"); + throw new SncpException(service + " not found " + FIELDPREFIX + "_messageAgent"); } } @@ -281,7 +281,7 @@ public abstract class Sncp { return; } try { - Field ts = service.getClass().getDeclaredField(FIELDPREFIX + "_messageagent"); + Field ts = service.getClass().getDeclaredField(FIELDPREFIX + "_messageAgent"); ts.setAccessible(true); ts.set(service, messageAgent); if (service instanceof WebSocketNode) { @@ -290,7 +290,7 @@ public abstract class Sncp { c.set(service, messageAgent); } } catch (Exception e) { - throw new SncpException(service + " not found " + FIELDPREFIX + "_messageagent"); + throw new SncpException(service + " not found " + FIELDPREFIX + "_messageAgent"); } } @@ -478,7 +478,9 @@ public abstract class Sncp { } final String supDynName = serviceImplClass.getName().replace('.', '/'); final String clientName = OldSncpClient.class.getName().replace('.', '/'); + final String sncpInfoName = SncpServiceInfo.class.getName().replace('.', '/'); final String resDesc = Type.getDescriptor(Resource.class); + final String sncpInfoDesc = Type.getDescriptor(SncpServiceInfo.class); final String clientDesc = Type.getDescriptor(OldSncpClient.class); final String anyValueDesc = Type.getDescriptor(AnyValue.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); @@ -546,7 +548,11 @@ public abstract class Sncp { fv.visitEnd(); } { - fv = cw.visitField(ACC_PRIVATE, FIELDPREFIX + "_messageagent", Type.getDescriptor(MessageAgent.class), null, null); + fv = cw.visitField(ACC_PRIVATE, FIELDPREFIX + "_sncpInfo", sncpInfoDesc, null, null); + fv.visitEnd(); + } + { + fv = cw.visitField(ACC_PRIVATE, FIELDPREFIX + "_messageAgent", Type.getDescriptor(MessageAgent.class), null, null); fv.visitEnd(); } { //构造函数 @@ -561,7 +567,7 @@ public abstract class Sncp { { // toString() mv = new MethodDebugVisitor(cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null)); mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_client", clientDesc); + mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_sncpInfo", sncpInfoDesc); Label l1 = new Label(); mv.visitJumpInsn(IFNONNULL, l1); mv.visitVarInsn(ALOAD, 0); @@ -571,8 +577,8 @@ public abstract class Sncp { mv.visitJumpInsn(GOTO, l2); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_client", clientDesc); - mv.visitMethodInsn(INVOKEVIRTUAL, clientName, "toSimpleString", "()Ljava/lang/String;", false); + mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_sncpInfo", sncpInfoDesc); + mv.visitMethodInsn(INVOKEVIRTUAL, sncpInfoName, "toSimpleString", "()Ljava/lang/String;", false); mv.visitLabel(l2); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); @@ -593,7 +599,9 @@ public abstract class Sncp { RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); c = newClazz.getDeclaredField(FIELDPREFIX + "_client"); RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); - c = newClazz.getDeclaredField(FIELDPREFIX + "_messageagent"); + c = newClazz.getDeclaredField(FIELDPREFIX + "_sncpInfo"); + RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); + c = newClazz.getDeclaredField(FIELDPREFIX + "_messageAgent"); RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); } catch (Exception e) { } @@ -679,7 +687,7 @@ public abstract class Sncp { } } if (messageAgent != null) { - Field c = newClazz.getDeclaredField(FIELDPREFIX + "_messageagent"); + Field c = newClazz.getDeclaredField(FIELDPREFIX + "_messageAgent"); c.setAccessible(true); c.set(service, messageAgent); } @@ -777,7 +785,9 @@ public abstract class Sncp { } final String supDynName = serviceTypeOrImplClass.getName().replace('.', '/'); final String clientName = OldSncpClient.class.getName().replace('.', '/'); + final String sncpInfoName = SncpServiceInfo.class.getName().replace('.', '/'); final String resDesc = Type.getDescriptor(Resource.class); + final String sncpInfoDesc = Type.getDescriptor(SncpServiceInfo.class); final String clientDesc = Type.getDescriptor(OldSncpClient.class); final String sncpDynDesc = Type.getDescriptor(SncpDyn.class); final String anyValueDesc = Type.getDescriptor(AnyValue.class); @@ -799,7 +809,7 @@ public abstract class Sncp { c.set(service, client); } if (messageAgent != null) { - Field c = newClazz.getDeclaredField(FIELDPREFIX + "_messageagent"); + Field c = newClazz.getDeclaredField(FIELDPREFIX + "_messageAgent"); c.setAccessible(true); c.set(service, messageAgent); if (service instanceof WebSocketNode) { @@ -861,7 +871,11 @@ public abstract class Sncp { fv.visitEnd(); } { - fv = cw.visitField(ACC_PRIVATE, FIELDPREFIX + "_messageagent", Type.getDescriptor(MessageAgent.class), null, null); + fv = cw.visitField(ACC_PRIVATE, FIELDPREFIX + "_sncpInfo", sncpInfoDesc, null, null); + fv.visitEnd(); + } + { + fv = cw.visitField(ACC_PRIVATE, FIELDPREFIX + "_messageAgent", Type.getDescriptor(MessageAgent.class), null, null); fv.visitEnd(); } { //构造函数 @@ -894,7 +908,7 @@ public abstract class Sncp { { // toString() mv = new MethodDebugVisitor(cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null)); mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_client", clientDesc); + mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_sncpInfo", sncpInfoDesc); Label l1 = new Label(); mv.visitJumpInsn(IFNONNULL, l1); mv.visitVarInsn(ALOAD, 0); @@ -904,8 +918,8 @@ public abstract class Sncp { mv.visitJumpInsn(GOTO, l2); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_client", clientDesc); - mv.visitMethodInsn(INVOKEVIRTUAL, clientName, "toSimpleString", "()Ljava/lang/String;", false); + mv.visitFieldInsn(GETFIELD, newDynName, FIELDPREFIX + "_sncpInfo", sncpInfoDesc); + mv.visitMethodInsn(INVOKEVIRTUAL, sncpInfoName, "toSimpleString", "()Ljava/lang/String;", false); mv.visitLabel(l2); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); @@ -1025,7 +1039,7 @@ public abstract class Sncp { RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); } if (messageAgent != null) { - Field c = newClazz.getDeclaredField(FIELDPREFIX + "_messageagent"); + Field c = newClazz.getDeclaredField(FIELDPREFIX + "_messageAgent"); c.setAccessible(true); c.set(service, messageAgent); RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); diff --git a/src/main/java/org/redkale/net/sncp/SncpServiceInfo.java b/src/main/java/org/redkale/net/sncp/SncpServiceInfo.java index 38685998b..2e109d57e 100644 --- a/src/main/java/org/redkale/net/sncp/SncpServiceInfo.java +++ b/src/main/java/org/redkale/net/sncp/SncpServiceInfo.java @@ -32,8 +32,6 @@ public final class SncpServiceInfo { protected final Class serviceType; - protected final T service; - protected final Uint128 serviceid; protected final int serviceVersion; @@ -59,21 +57,19 @@ public final class SncpServiceInfo { //远程模式, 可能为null protected Set remoteAddresses; - SncpServiceInfo(String resourceName, Class resourceServiceType, final T service, Convert convert, + SncpServiceInfo(String resourceName, Class resourceServiceType, final Class serviceImplClass, Convert convert, SncpClient sncpClient, MessageAgent messageAgent, SncpMessageClient messageClient) { this.sncpClient = sncpClient; this.name = resourceName; this.serviceType = resourceServiceType; this.serviceid = Sncp.serviceid(resourceName, resourceServiceType); - this.service = service; this.convert = convert; this.serviceVersion = 0; this.messageAgent = messageAgent; this.messageClient = messageAgent == null ? null : messageAgent.getSncpMessageClient(); - this.topic = messageAgent == null ? null : messageAgent.generateSncpReqTopic(service); + this.topic = messageAgent == null ? null : messageAgent.generateSncpReqTopic(resourceName, resourceServiceType); final List serviceActions = new ArrayList<>(); - final Class serviceImplClass = service.getClass(); for (Map.Entry en : loadMethodActions(resourceServiceType).entrySet()) { serviceActions.add(new SncpServiceAction(serviceImplClass, en.getValue(), serviceid, en.getKey())); } @@ -85,6 +81,22 @@ public final class SncpServiceInfo { return sncpClient.remote(this, index, params); } + @Override + public String toString() { + InetSocketAddress clientSncpAddress = sncpClient == null ? null : sncpClient.getClientSncpAddress(); + return this.getClass().getSimpleName() + "(service = " + serviceType.getSimpleName() + ", serviceid = " + serviceid + ", serviceVersion = " + serviceVersion + ", name = '" + name + + "', address = " + (clientSncpAddress == null ? "" : (clientSncpAddress.getHostString() + ":" + clientSncpAddress.getPort())) + + ", actions.size = " + actions.length + ")"; + } + + public String toSimpleString() { //给Sncp产生的Service用 + InetSocketAddress clientSncpAddress = sncpClient == null ? null : sncpClient.getClientSncpAddress(); + return serviceType.getSimpleName() + "(name = '" + name + "', serviceid = " + serviceid + ", serviceVersion = " + serviceVersion + + ", clientaddr = " + (clientSncpAddress == null ? "" : (clientSncpAddress.getHostString() + ":" + clientSncpAddress.getPort())) + + ((remoteGroups == null || remoteGroups.isEmpty()) ? "" : ", remoteGroups = " + remoteGroups) + + ", actions.size = " + actions.length + ")"; + } + public void updateRemoteAddress(Set remoteGroups, Set remoteAddresses) { this.remoteGroups = remoteGroups; this.remoteAddresses = remoteAddresses; @@ -98,10 +110,6 @@ public final class SncpServiceInfo { return serviceType; } - public T getService() { - return service; - } - public Uint128 getServiceid() { return serviceid; }