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