From 5d4d23672f2a0c222cfec2ddb8509c0496256d91 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Fri, 19 Feb 2016 14:43:37 +0800 Subject: [PATCH] --- src/org/redkale/net/PrepareServlet.java | 17 +++++++++- src/org/redkale/net/Server.java | 16 ++++++---- src/org/redkale/net/Servlet.java | 2 ++ .../redkale/net/http/HttpPrepareServlet.java | 32 +++++++++---------- src/org/redkale/net/http/HttpServer.java | 6 ++-- src/org/redkale/net/http/HttpServlet.java | 3 -- src/org/redkale/net/sncp/SncpDynServlet.java | 3 +- .../redkale/net/sncp/SncpPrepareServlet.java | 15 ++++++--- src/org/redkale/net/sncp/SncpServer.java | 8 ++--- src/org/redkale/net/sncp/SncpServlet.java | 2 -- 10 files changed, 62 insertions(+), 42 deletions(-) diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 28195d476..03ad19ead 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -8,8 +8,10 @@ package org.redkale.net; import java.io.*; import java.nio.*; import java.nio.channels.*; +import java.util.*; import java.util.concurrent.atomic.*; import java.util.logging.*; +import org.redkale.util.*; /** * @@ -21,12 +23,18 @@ import java.util.logging.*; * @param Request的子类型 * @param

Response的子类型 */ -public abstract class PrepareServlet, P extends Response> extends Servlet { +public abstract class PrepareServlet, P extends Response> extends Servlet { protected final AtomicLong executeCounter = new AtomicLong(); //执行请求次数 protected final AtomicLong illRequestCounter = new AtomicLong(); //错误请求次数 + protected final List> servlets = new ArrayList<>(); + + protected final Map> mappings = new HashMap<>(); + + 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(); final int rs = request.readHeader(buffer); @@ -74,4 +82,11 @@ public abstract class PrepareServlet, P } } + protected AnyValue getServletConf(Servlet servlet) { + return servlet._conf; + } + + protected void setServletConf(Servlet servlet, AnyValue conf) { + servlet._conf = conf; + } } diff --git a/src/org/redkale/net/Server.java b/src/org/redkale/net/Server.java index 512fba766..e580c0533 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 { +public abstract class Server, P extends Response> { public static final String RESNAME_SERVER_ROOT = "SERVER_ROOT"; @@ -37,7 +37,9 @@ public abstract class Server { protected final String protocol; - protected final PrepareServlet prepare; + protected final PrepareServlet prepare; + + protected C context; protected AnyValue config; @@ -45,8 +47,6 @@ public abstract class Server { protected InetSocketAddress address; - protected Context context; - protected int backlog; protected ProtocolServer serverChannel; @@ -69,7 +69,7 @@ public abstract class Server { private ScheduledThreadPoolExecutor scheduler; - protected Server(long serverStartTime, String protocol, PrepareServlet 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,6 +116,10 @@ public abstract class Server { return this.logger; } + public > void addServlet(S servlet, final Object attachment, AnyValue conf, K... mappings) { + this.prepare.addServlet(servlet, attachment, conf, mappings); + } + public void start() throws IOException { this.context = this.createContext(); this.prepare.init(this.context, config); @@ -133,7 +137,7 @@ public abstract class Server { + ", started in " + (System.currentTimeMillis() - context.getServerStartTime()) + " ms"); } - protected abstract Context createContext(); + protected abstract C createContext(); public void shutdown() throws IOException { long s = System.currentTimeMillis(); diff --git a/src/org/redkale/net/Servlet.java b/src/org/redkale/net/Servlet.java index 28e05e80c..5324152f3 100644 --- a/src/org/redkale/net/Servlet.java +++ b/src/org/redkale/net/Servlet.java @@ -20,6 +20,8 @@ import java.io.IOException; */ public abstract class Servlet, P extends Response> { + AnyValue _conf; //当前Servlet的配置 + public void init(C context, AnyValue config) { } diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 8e557b00c..82fa6dc88 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -23,11 +23,7 @@ import org.redkale.watch.*; * * @author zhangjx */ -public final class HttpPrepareServlet extends PrepareServlet { - - private final List servlets = new ArrayList<>(); - - private final Map strmaps = new HashMap<>(); +public final class HttpPrepareServlet extends PrepareServlet { private SimpleEntry, HttpServlet>[] regArray = new SimpleEntry[0]; @@ -37,11 +33,11 @@ public final class HttpPrepareServlet extends PrepareServlet { if (s instanceof WebSocketServlet) { - ((WebSocketServlet) s).preInit(context, s._conf); + ((WebSocketServlet) s).preInit(context, getServletConf(s)); } else if (s instanceof BasedHttpServlet) { - ((BasedHttpServlet) s).preInit(context, s._conf); + ((BasedHttpServlet) s).preInit(context, getServletConf(s)); } - s.init(context, s._conf); + s.init(context, getServletConf(s)); }); final WatchFactory watch = context.getWatchFactory(); if (watch != null) { @@ -71,7 +67,7 @@ public final class HttpPrepareServlet extends PrepareServlet servlet = this.mappings.isEmpty() ? null : this.mappings.get(uri); if (servlet == null && this.regArray != null) { for (SimpleEntry, HttpServlet> en : regArray) { if (en.getKey().test(uri)) { @@ -88,10 +84,12 @@ public final class HttpPrepareServlet extends PrepareServlet> void addServlet(S servlet0, Object prefix, AnyValue conf, String... mappings) { if (prefix == null) prefix = ""; + HttpServlet servlet = (HttpServlet) servlet0; for (String mapping : mappings) { - if (!prefix.isEmpty()) mapping = prefix + mapping; + if (!prefix.toString().isEmpty()) mapping = prefix + mapping; if (contains(mapping, '.', '*', '{', '[', '(', '|', '^', '$', '+', '?', '\\')) { //是否是正则表达式)) if (mapping.charAt(0) != '^') mapping = '^' + mapping; if (mapping.endsWith("/*")) { @@ -107,11 +105,11 @@ public final class HttpPrepareServlet extends PrepareServlet(Pattern.compile(mapping).asPredicate(), servlet); } } else if (mapping != null && !mapping.isEmpty()) { - strmaps.put(mapping, servlet); + this.mappings.put(mapping, servlet); } } - servlet._conf = conf; - servlet._prefix = prefix == null ? "" : prefix; + setServletConf(servlet, conf); + servlet._prefix = prefix == null ? "" : prefix.toString(); this.servlets.add(servlet); } @@ -135,11 +133,11 @@ public final class HttpPrepareServlet extends PrepareServlet { - s.destroy(context, s._conf); + s.destroy(context, getServletConf(s)); if (s instanceof WebSocketServlet) { - ((WebSocketServlet) s).postDestroy(context, s._conf); + ((WebSocketServlet) s).postDestroy(context, getServletConf(s)); } else if (s instanceof BasedHttpServlet) { - ((BasedHttpServlet) s).postDestroy(context, s._conf); + ((BasedHttpServlet) s).postDestroy(context, getServletConf(s)); } }); } diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index b91821cef..f026a239c 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); @@ -37,12 +37,12 @@ public final class HttpServer extends Server { } public void addHttpServlet(HttpServlet servlet, final String prefix, AnyValue conf, String... mappings) { - ((HttpPrepareServlet) this.prepare).addHttpServlet(servlet, prefix, conf, mappings); + this.prepare.addServlet(servlet, prefix, conf, mappings); } @Override @SuppressWarnings("unchecked") - protected Context createContext() { + protected HttpContext createContext() { final int port = this.address.getPort(); AtomicLong createBufferCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("HTTP_" + port + ".Buffer.creatCounter"); AtomicLong cycleBufferCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("HTTP_" + port + ".Buffer.cycleCounter"); diff --git a/src/org/redkale/net/http/HttpServlet.java b/src/org/redkale/net/http/HttpServlet.java index 517f4ca6a..e8fe6bf94 100644 --- a/src/org/redkale/net/http/HttpServlet.java +++ b/src/org/redkale/net/http/HttpServlet.java @@ -6,7 +6,6 @@ package org.redkale.net.http; import org.redkale.net.Servlet; -import org.redkale.util.*; /** * @@ -17,8 +16,6 @@ import org.redkale.util.*; */ public abstract class HttpServlet extends Servlet { - AnyValue _conf; //当前HttpServlet的配置 - String _prefix = ""; //当前HttpServlet的path前缀 @Override diff --git a/src/org/redkale/net/sncp/SncpDynServlet.java b/src/org/redkale/net/sncp/SncpDynServlet.java index e1c4daf69..480c2f18e 100644 --- a/src/org/redkale/net/sncp/SncpDynServlet.java +++ b/src/org/redkale/net/sncp/SncpDynServlet.java @@ -51,8 +51,7 @@ public final class SncpDynServlet extends SncpServlet { private Supplier bufferSupplier; - public SncpDynServlet(final BsonConvert convert, final String serviceName, final Class type, final Service service, final AnyValue conf) { - this.conf = conf; + 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); diff --git a/src/org/redkale/net/sncp/SncpPrepareServlet.java b/src/org/redkale/net/sncp/SncpPrepareServlet.java index 03ac96877..a5747d123 100644 --- a/src/org/redkale/net/sncp/SncpPrepareServlet.java +++ b/src/org/redkale/net/sncp/SncpPrepareServlet.java @@ -10,6 +10,7 @@ import org.redkale.util.AnyValue; import java.io.IOException; import java.nio.ByteBuffer; import java.util.*; +import org.redkale.net.*; import org.redkale.util.*; /** @@ -19,7 +20,7 @@ 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(); @@ -27,7 +28,13 @@ public class SncpPrepareServlet extends PrepareServlet singlemaps = new HashMap<>(); - public void addSncpServlet(SncpServlet servlet) { + @Override + public > void addServlet(S 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); @@ -54,7 +61,7 @@ public class SncpPrepareServlet extends PrepareServlet> values = this.maps.values(); values.stream().forEach((en) -> { - en.values().stream().forEach(s -> s.init(context, s.conf)); + en.values().stream().forEach(s -> s.init(context, getServletConf(s))); }); } @@ -62,7 +69,7 @@ public class SncpPrepareServlet extends PrepareServlet> values = this.maps.values(); values.stream().forEach((en) -> { - en.values().stream().forEach(s -> s.destroy(context, s.conf)); + en.values().stream().forEach(s -> s.destroy(context, getServletConf(s))); }); } diff --git a/src/org/redkale/net/sncp/SncpServer.java b/src/org/redkale/net/sncp/SncpServer.java index 2bb96dd6a..5c6221b4e 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); @@ -37,8 +37,8 @@ public final class SncpServer extends Server { } public SncpDynServlet addService(ServiceWrapper entry) { - SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), entry.getName(), entry.getType(), entry.getService(), entry.getConf()); - ((SncpPrepareServlet) this.prepare).addSncpServlet(sds); + SncpDynServlet sds = new SncpDynServlet(BsonFactory.root().getConvert(), entry.getName(), entry.getType(), entry.getService()); + this.prepare.addServlet(sds, null, entry.getConf()); return sds; } @@ -48,7 +48,7 @@ public final class SncpServer extends Server { @Override @SuppressWarnings("unchecked") - protected Context createContext() { + protected SncpContext createContext() { final int port = this.address.getPort(); AtomicLong createBufferCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("SNCP_" + port + ".Buffer.creatCounter"); AtomicLong cycleBufferCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("SNCP_" + port + ".Buffer.cycleCounter"); diff --git a/src/org/redkale/net/sncp/SncpServlet.java b/src/org/redkale/net/sncp/SncpServlet.java index 1043f9ffe..f25d73dcb 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 { - AnyValue conf; - public abstract DLong getNameid(); public abstract DLong getServiceid();