From e632280d44c3863e43dd51d8e141735fd3750267 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Mon, 22 Feb 2016 10:46:49 +0800 Subject: [PATCH] --- src/org/redkale/net/PrepareServlet.java | 8 +-- src/org/redkale/net/Server.java | 8 +-- .../redkale/net/http/HttpPrepareServlet.java | 11 ++-- src/org/redkale/net/http/HttpServer.java | 2 +- src/org/redkale/net/sncp/Sncp.java | 16 ++---- src/org/redkale/net/sncp/SncpClient.java | 18 ++---- src/org/redkale/net/sncp/SncpDynServlet.java | 11 +--- .../redkale/net/sncp/SncpPrepareServlet.java | 57 ++++--------------- src/org/redkale/net/sncp/SncpRequest.java | 14 ++--- src/org/redkale/net/sncp/SncpResponse.java | 6 +- src/org/redkale/net/sncp/SncpServer.java | 2 +- src/org/redkale/net/sncp/SncpServlet.java | 2 - 12 files changed, 42 insertions(+), 113 deletions(-) diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 03ad19ead..b0ee5c272 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -23,17 +23,17 @@ import org.redkale.util.*; * @param Request的子类型 * @param

Response的子类型 */ -public abstract class PrepareServlet, P extends Response> extends Servlet { +public abstract class PrepareServlet, P extends Response, S extends Servlet> extends Servlet { protected final AtomicLong executeCounter = new AtomicLong(); //执行请求次数 protected final AtomicLong illRequestCounter = new AtomicLong(); //错误请求次数 - protected final List> servlets = new ArrayList<>(); + protected final Set servlets = new HashSet<>(); - protected final Map> mappings = new HashMap<>(); + protected final Map mappings = new HashMap<>(); - public abstract > void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings); + public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings); public final void prepare(final ByteBuffer buffer, final R request, final P response) throws IOException { executeCounter.incrementAndGet(); diff --git a/src/org/redkale/net/Server.java b/src/org/redkale/net/Server.java index e580c0533..5fbd56461 100644 --- a/src/org/redkale/net/Server.java +++ b/src/org/redkale/net/Server.java @@ -24,7 +24,7 @@ import org.redkale.watch.*; * * @author zhangjx */ -public abstract class Server, P extends Response> { +public abstract class Server, P extends Response, S extends Servlet> { public static final String RESNAME_SERVER_ROOT = "SERVER_ROOT"; @@ -37,7 +37,7 @@ public abstract class Server prepare; + protected final PrepareServlet prepare; protected C context; @@ -69,7 +69,7 @@ public abstract class Server servlet, final WatchFactory watch) { + protected Server(long serverStartTime, String protocol, PrepareServlet servlet, final WatchFactory watch) { this.serverStartTime = serverStartTime; this.protocol = protocol; this.prepare = servlet; @@ -116,7 +116,7 @@ public abstract class Server> void addServlet(S servlet, final Object attachment, AnyValue conf, K... mappings) { + public void addServlet(S servlet, final Object attachment, AnyValue conf, K... mappings) { this.prepare.addServlet(servlet, attachment, conf, mappings); } diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 82fa6dc88..c9507b859 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -23,7 +23,7 @@ import org.redkale.watch.*; * * @author zhangjx */ -public final class HttpPrepareServlet extends PrepareServlet { +public final class HttpPrepareServlet extends PrepareServlet { private SimpleEntry, HttpServlet>[] regArray = new SimpleEntry[0]; @@ -31,7 +31,7 @@ public final class HttpPrepareServlet extends PrepareServlet { + this.servlets.forEach(s -> { if (s instanceof WebSocketServlet) { ((WebSocketServlet) s).preInit(context, getServletConf(s)); } else if (s instanceof BasedHttpServlet) { @@ -41,7 +41,7 @@ public final class HttpPrepareServlet extends PrepareServlet { + this.servlets.forEach(s -> { watch.inject(s); }); } @@ -85,9 +85,8 @@ public final class HttpPrepareServlet extends PrepareServlet> void addServlet(S servlet0, Object prefix, AnyValue conf, String... mappings) { + public void addServlet(HttpServlet servlet, Object prefix, AnyValue conf, String... mappings) { if (prefix == null) prefix = ""; - HttpServlet servlet = (HttpServlet) servlet0; for (String mapping : mappings) { if (!prefix.toString().isEmpty()) mapping = prefix + mapping; if (contains(mapping, '.', '*', '{', '[', '(', '|', '^', '$', '+', '?', '\\')) { //是否是正则表达式)) @@ -132,7 +131,7 @@ public final class HttpPrepareServlet extends PrepareServlet { + this.servlets.forEach(s -> { s.destroy(context, getServletConf(s)); if (s instanceof WebSocketServlet) { ((WebSocketServlet) s).postDestroy(context, getServletConf(s)); diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index f026a239c..83ea1c142 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -20,7 +20,7 @@ import org.redkale.watch.*; * * @author zhangjx */ -public final class HttpServer extends Server { +public final class HttpServer extends Server { public HttpServer() { this(System.currentTimeMillis(), null); diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index eee544f4c..9d07ac0cc 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -33,12 +33,6 @@ import org.redkale.service.DynRemote; */ public abstract class Sncp { - private static final java.lang.reflect.Type GROUPS_TYPE1 = new TypeToken>() { - }.getType(); - - private static final java.lang.reflect.Type GROUPS_TYPE2 = new TypeToken() { - }.getType(); - static final String LOCALPREFIX = "_DynLocal"; static final String REMOTEPREFIX = "_DynRemote"; @@ -725,7 +719,7 @@ public abstract class Sncp { try { Field e = newClazz.getDeclaredField("_client"); e.setAccessible(true); - client = new SncpClient(name, executor, hash(serviceClass), false, newClazz, clientAddress); + client = new SncpClient(name, serviceClass, executor, false, newClazz, clientAddress); e.set(rs, client); } catch (NoSuchFieldException ne) { } @@ -734,7 +728,7 @@ public abstract class Sncp { StringBuilder sb = new StringBuilder(); sb.append(newClazz.getName()).append("{name = '").append(name).append("'"); if (client != null) { - sb.append(", nameid = ").append(client.getNameid()).append(", serviceid = ").append(client.getServiceid()); + sb.append(", serviceid = ").append(client.getServiceid()); sb.append(", action.size = ").append(client.getActionCount()); List groups = new ArrayList<>(); if (sameGroupTransport != null) groups.add(sameGroupTransport.getName()); @@ -857,7 +851,7 @@ public abstract class Sncp { final String anyValueDesc = Type.getDescriptor(AnyValue.class); ClassLoader loader = Sncp.class.getClassLoader(); String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + REMOTEPREFIX + serviceClass.getSimpleName(); - final SncpClient client = new SncpClient(name, executor, hash(serviceClass), true, realed ? createLocalServiceClass(name, serviceClass) : serviceClass, clientAddress); + final SncpClient client = new SncpClient(name, serviceClass, executor, true, realed ? createLocalServiceClass(name, serviceClass) : serviceClass, clientAddress); try { Class newClazz = Class.forName(newDynName.replace('/', '.')); T rs = (T) newClazz.newInstance(); @@ -870,7 +864,7 @@ public abstract class Sncp { { StringBuilder sb = new StringBuilder(); sb.append(newClazz.getName()).append("{name = '").append(name); - sb.append("', nameid = ").append(client.getNameid()).append(", serviceid = ").append(client.getServiceid()); + sb.append("', serviceid = ").append(client.getServiceid()); sb.append(", action.size = ").append(client.getActionCount()); sb.append(", address = ").append(clientAddress).append(", groups = ").append(transport == null ? null : transport.getName()); sb.append(", remoteaddrs = ").append(transport == null ? null : Arrays.asList(transport.getRemoteAddresses())); @@ -1089,7 +1083,7 @@ public abstract class Sncp { { StringBuilder sb = new StringBuilder(); sb.append(newClazz.getName()).append("{name = '").append(name); - sb.append("', nameid = ").append(client.getNameid()).append(", serviceid = ").append(client.getServiceid()); + sb.append("', serviceid = ").append(client.getServiceid()); sb.append(", action.size = ").append(client.getActionCount()); sb.append(", address = ").append(clientAddress).append(", groups = ").append(transport == null ? null : transport.getName()); sb.append(", remotes = ").append(transport == null ? null : Arrays.asList(transport.getRemoteAddresses())); diff --git a/src/org/redkale/net/sncp/SncpClient.java b/src/org/redkale/net/sncp/SncpClient.java index b07955e9d..8aa29f612 100644 --- a/src/org/redkale/net/sncp/SncpClient.java +++ b/src/org/redkale/net/sncp/SncpClient.java @@ -135,21 +135,18 @@ public final class SncpClient { protected final DLong serviceid; - protected final DLong nameid; - protected final SncpAction[] actions; protected final Consumer executor; - public SncpClient(final String serviceName, final Consumer executor, final DLong serviceid, boolean remote, + public SncpClient(final String serviceName, final Class serviceType, final Consumer executor, boolean remote, final Class serviceClass, final InetSocketAddress clientAddress) { this.remote = remote; this.executor = executor; this.serviceClass = serviceClass; this.clientAddress = clientAddress; this.name = serviceName; - this.nameid = Sncp.hash(serviceName); - this.serviceid = serviceid; + this.serviceid = Sncp.hash(serviceType.getName() + ':' + serviceName); final List methodens = new ArrayList<>(); //------------------------------------------------------------------------------ for (java.lang.reflect.Method method : parseMethod(serviceClass)) { @@ -165,10 +162,6 @@ public final class SncpClient { return clientAddress; } - public DLong getNameid() { - return nameid; - } - public DLong getServiceid() { return serviceid; } @@ -181,8 +174,8 @@ public final class SncpClient { public String toString() { String service = serviceClass.getName(); if (remote) service = service.replace(Sncp.LOCALPREFIX, Sncp.REMOTEPREFIX); - return this.getClass().getSimpleName() + "(service = " + service + ", serviceid = " + serviceid + ", nameid = " + nameid - + ", name = '" + name + "', address = " + (clientAddress == null ? "" : (clientAddress.getHostString() + ":" + clientAddress.getPort())) + return this.getClass().getSimpleName() + "(service = " + service + ", serviceid = " + serviceid + ", name = '" + name + + "', address = " + (clientAddress == null ? "" : (clientAddress.getHostString() + ":" + clientAddress.getPort())) + ", actions.size = " + actions.length + ")"; } @@ -449,8 +442,6 @@ public final class SncpClient { if (buffer.getChar() != HEADER_SIZE) throw new RuntimeException("sncp(" + action.method + ") buffer receive header.length not " + HEADER_SIZE); DLong rserviceid = DLong.read(buffer); if (!rserviceid.equals(serviceid)) throw new RuntimeException("sncp(" + action.method + ") response.serviceid = " + serviceid + ", but request.serviceid =" + rserviceid); - DLong rnameid = DLong.read(buffer); - if (!rnameid.equals(nameid)) throw new RuntimeException("sncp(" + action.method + ") response.nameid = " + nameid + ", but receive nameid =" + rnameid); DLong raction = DLong.read(buffer); if (!action.actionid.equals(raction)) throw new RuntimeException("sncp(" + action.method + ") response.actionid = " + action.actionid + ", but request.actionid =(" + raction + ")"); buffer.getInt(); //地址 @@ -464,7 +455,6 @@ public final class SncpClient { buffer.putLong(seqid); //序列号 buffer.putChar((char) HEADER_SIZE); //header长度 DLong.write(buffer, this.serviceid); - DLong.write(buffer, this.nameid); DLong.write(buffer, actionid); buffer.put(addrBytes); buffer.putChar((char) this.addrPort); diff --git a/src/org/redkale/net/sncp/SncpDynServlet.java b/src/org/redkale/net/sncp/SncpDynServlet.java index 480c2f18e..846ac094c 100644 --- a/src/org/redkale/net/sncp/SncpDynServlet.java +++ b/src/org/redkale/net/sncp/SncpDynServlet.java @@ -45,8 +45,6 @@ public final class SncpDynServlet extends SncpServlet { private final DLong serviceid; - private final DLong nameid; - private final HashMap actions = new HashMap<>(); private Supplier bufferSupplier; @@ -54,8 +52,7 @@ public final class SncpDynServlet extends SncpServlet { public SncpDynServlet(final BsonConvert convert, final String serviceName, final Class type, final Service service) { this.serviceName = serviceName; this.type = type; - this.nameid = Sncp.hash(serviceName); - this.serviceid = Sncp.hash(type); + this.serviceid = Sncp.hash(type.getName() + ':' + serviceName); Set actionids = new HashSet<>(); for (java.lang.reflect.Method method : service.getClass().getMethods()) { if (method.isSynthetic()) continue; @@ -90,14 +87,10 @@ public final class SncpDynServlet extends SncpServlet { for (int i = 0; i < maxNameLength - serviceName.length(); i++) { sb.append(' '); } - sb.append(", nameid=").append(nameid).append(", actions.size=").append(actions.size() > 9 ? "" : " ").append(actions.size()).append(")"); + sb.append(", actions.size=").append(actions.size() > 9 ? "" : " ").append(actions.size()).append(")"); return sb.toString(); } - @Override - public DLong getNameid() { - return nameid; - } @Override public DLong getServiceid() { diff --git a/src/org/redkale/net/sncp/SncpPrepareServlet.java b/src/org/redkale/net/sncp/SncpPrepareServlet.java index a5747d123..626e83814 100644 --- a/src/org/redkale/net/sncp/SncpPrepareServlet.java +++ b/src/org/redkale/net/sncp/SncpPrepareServlet.java @@ -10,7 +10,6 @@ import org.redkale.util.AnyValue; import java.io.IOException; import java.nio.ByteBuffer; import java.util.*; -import org.redkale.net.*; import org.redkale.util.*; /** @@ -20,57 +19,37 @@ import org.redkale.util.*; * * @author zhangjx */ -public class SncpPrepareServlet extends PrepareServlet { +public class SncpPrepareServlet extends PrepareServlet { private static final ByteBuffer pongBuffer = ByteBuffer.wrap("PONG".getBytes()).asReadOnlyBuffer(); - private final Map> maps = new HashMap<>(); - - private final Map singlemaps = new HashMap<>(); - @Override - public > void addServlet(S servlet, Object attachment, AnyValue conf, DLong... mappings) { + public void addServlet(SncpServlet servlet, Object attachment, AnyValue conf, DLong... mappings) { addServlet((SncpServlet) servlet, conf); } public void addServlet(SncpServlet servlet, AnyValue conf) { setServletConf(servlet, conf); - if (servlet.getNameid() == DLong.ZERO) { - synchronized (singlemaps) { - singlemaps.put(servlet.getServiceid(), servlet); - } - } else { - synchronized (maps) { - Map m = maps.get(servlet.getServiceid()); - if (m == null) { - m = new HashMap<>(); - maps.put(servlet.getServiceid(), m); - } - m.put(servlet.getNameid(), servlet); - } + synchronized (mappings) { + mappings.put(servlet.getServiceid(), servlet); + servlets.add(servlet); } } public List getSncpServlets() { - ArrayList list = new ArrayList<>(singlemaps.values()); - maps.values().forEach(x -> list.addAll(x.values())); + ArrayList list = new ArrayList<>(servlets.size()); + servlets.forEach(x -> list.add((SncpServlet) x)); return list; } @Override public void init(SncpContext context, AnyValue config) { - Collection> values = this.maps.values(); - values.stream().forEach((en) -> { - en.values().stream().forEach(s -> s.init(context, getServletConf(s))); - }); + servlets.forEach(s -> s.init(context, getServletConf(s))); } @Override public void destroy(SncpContext context, AnyValue config) { - Collection> values = this.maps.values(); - values.stream().forEach((en) -> { - en.values().stream().forEach(s -> s.destroy(context, getServletConf(s))); - }); + servlets.forEach(s -> s.destroy(context, getServletConf(s))); } @Override @@ -79,23 +58,9 @@ public class SncpPrepareServlet extends PrepareServlet m = maps.get(request.getServiceid()); - if (m == null) { - response.finish(SncpResponse.RETCODE_ILLSERVICEID, null); //无效serviceid - return; - } - servlet = m.get(request.getNameid()); - } + SncpServlet servlet = (SncpServlet) mappings.get(request.getServiceid()); if (servlet == null) { - response.finish(SncpResponse.RETCODE_ILLNAMEID, null); //无效nameid + response.finish(SncpResponse.RETCODE_ILLSERVICEID, null); //无效serviceid } else { servlet.execute(request, response); } diff --git a/src/org/redkale/net/sncp/SncpRequest.java b/src/org/redkale/net/sncp/SncpRequest.java index 684227e7e..c465870fb 100644 --- a/src/org/redkale/net/sncp/SncpRequest.java +++ b/src/org/redkale/net/sncp/SncpRequest.java @@ -13,12 +13,14 @@ import org.redkale.util.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ public final class SncpRequest extends Request { - public static final int HEADER_SIZE = 72; + public static final int HEADER_SIZE = 56; public static final byte[] DEFAULT_HEADER = new byte[HEADER_SIZE]; @@ -28,8 +30,6 @@ public final class SncpRequest extends Request { private DLong serviceid; - private DLong nameid; - private DLong actionid; private int bodylength; @@ -60,7 +60,6 @@ public final class SncpRequest extends Request { return -1; } this.serviceid = DLong.read(buffer); - this.nameid = DLong.read(buffer); this.actionid = DLong.read(buffer); buffer.get(bufferbytes); this.bodylength = buffer.getInt(); @@ -102,7 +101,6 @@ public final class SncpRequest extends Request { protected void recycle() { this.seqid = 0; this.serviceid = null; - this.nameid = null; this.actionid = null; this.bodylength = 0; this.bodyoffset = 0; @@ -128,10 +126,6 @@ public final class SncpRequest extends Request { return serviceid; } - public DLong getNameid() { - return nameid; - } - public DLong getActionid() { return actionid; } diff --git a/src/org/redkale/net/sncp/SncpResponse.java b/src/org/redkale/net/sncp/SncpResponse.java index cf9c2aa19..422e576de 100644 --- a/src/org/redkale/net/sncp/SncpResponse.java +++ b/src/org/redkale/net/sncp/SncpResponse.java @@ -23,9 +23,7 @@ public final class SncpResponse extends Response { public static final int RETCODE_ILLSERVICEID = (1 << 10); //无效serviceid - public static final int RETCODE_ILLNAMEID = (1 << 11); //无效nameid - - public static final int RETCODE_ILLACTIONID = (1 << 12); //无效actionid + public static final int RETCODE_ILLACTIONID = (1 << 11); //无效actionid public static final int RETCODE_THROWEXCEPTION = (1 << 30); //内部异常 @@ -39,7 +37,6 @@ public final class SncpResponse extends Response { public static String getRetCodeInfo(int retcode) { if (retcode == RETCODE_ILLSERVICEID) return "serviceid is invalid"; - if (retcode == RETCODE_ILLNAMEID) return "nameid is invalid"; if (retcode == RETCODE_ILLACTIONID) return "actionid is invalid"; if (retcode == RETCODE_THROWEXCEPTION) return "Inner exception"; return null; @@ -71,7 +68,6 @@ public final class SncpResponse extends Response { buffer.putLong(request.getSeqid()); buffer.putChar((char) SncpRequest.HEADER_SIZE); DLong.write(buffer, request.getServiceid()); - DLong.write(buffer, request.getNameid()); DLong.write(buffer, request.getActionid()); buffer.put(addrBytes); buffer.putChar((char) this.addrPort); diff --git a/src/org/redkale/net/sncp/SncpServer.java b/src/org/redkale/net/sncp/SncpServer.java index 5c6221b4e..07ead6b0a 100644 --- a/src/org/redkale/net/sncp/SncpServer.java +++ b/src/org/redkale/net/sncp/SncpServer.java @@ -21,7 +21,7 @@ import org.redkale.watch.*; * * @author zhangjx */ -public final class SncpServer extends Server { +public final class SncpServer extends Server { public SncpServer() { this(System.currentTimeMillis(), null); diff --git a/src/org/redkale/net/sncp/SncpServlet.java b/src/org/redkale/net/sncp/SncpServlet.java index f25d73dcb..bfe46615a 100644 --- a/src/org/redkale/net/sncp/SncpServlet.java +++ b/src/org/redkale/net/sncp/SncpServlet.java @@ -17,8 +17,6 @@ import org.redkale.util.*; */ public abstract class SncpServlet extends Servlet implements Comparable { - public abstract DLong getNameid(); - public abstract DLong getServiceid(); @Override