diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 6cd757eae..4eea2af3a 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -15,7 +15,7 @@ import org.redkale.util.*; /** * 根Servlet, 一个Server只能存在一个根Servlet - * + * * 用于分发Request请求 * *

@@ -34,9 +34,33 @@ public abstract class PrepareServlet servlets = new HashSet<>(); + private final Object lock1 = new Object(); - protected final Map mappings = new HashMap<>(); + private Set servlets = new HashSet<>(); + + private final Object lock2 = new Object(); + + private Map mappings = new HashMap<>(); + + protected void putServlet(S servlet) { + synchronized (lock1) { + Set newservlets = new HashSet<>(servlets); + newservlets.add(servlet); + this.servlets = newservlets; + } + } + + protected void putMapping(K key, S value) { + synchronized (lock2) { + Map newmappings = new HashMap<>(mappings); + newmappings.put(key, value); + this.mappings = newmappings; + } + } + + protected S mappingServlet(K key) { + return mappings.get(key); + } public abstract void addServlet(S servlet, Object attachment, AnyValue conf, K... mappings); diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 986d95e24..b8f544d55 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -37,7 +37,8 @@ public class HttpPrepareServlet extends PrepareServlet { + Collection servlets = getServlets(); + servlets.forEach(s -> { if (s instanceof WebSocketServlet) { ((WebSocketServlet) s).preInit(context, getServletConf(s)); } else if (s instanceof HttpBaseServlet) { @@ -47,7 +48,7 @@ public class HttpPrepareServlet extends PrepareServlet { + servlets.forEach(s -> { watch.inject(s); }); } @@ -82,7 +83,7 @@ public class HttpPrepareServlet extends PrepareServlet servlet = this.mappings.isEmpty() ? null : this.mappings.get(uri); + Servlet servlet = mappingServlet(uri); if (servlet == null && this.regArray != null) { for (SimpleEntry, HttpServlet> en : regArray) { if (en.getKey().test(uri)) { @@ -138,7 +139,7 @@ public class HttpPrepareServlet extends PrepareServlet(Pattern.compile(mapping).asPredicate(), servlet); } } else if (mapping != null && !mapping.isEmpty()) { - super.mappings.put(mapping, servlet); + putMapping(mapping, servlet); } if (this.allMapStrings.containsKey(mapping)) { Class old = this.allMapStrings.get(mapping); @@ -148,7 +149,7 @@ public class HttpPrepareServlet extends PrepareServlet { + getServlets().forEach(s -> { s.destroy(context, getServletConf(s)); if (s instanceof WebSocketServlet) { ((WebSocketServlet) s).postDestroy(context, getServletConf(s)); diff --git a/src/org/redkale/net/sncp/SncpPrepareServlet.java b/src/org/redkale/net/sncp/SncpPrepareServlet.java index 167e050e5..934bb5220 100644 --- a/src/org/redkale/net/sncp/SncpPrepareServlet.java +++ b/src/org/redkale/net/sncp/SncpPrepareServlet.java @@ -30,26 +30,22 @@ public class SncpPrepareServlet extends PrepareServlet getSncpServlets() { - ArrayList list = new ArrayList<>(servlets.size()); - servlets.forEach(x -> list.add((SncpServlet) x)); - return list; + return new ArrayList<>(getServlets()); } @Override public void init(SncpContext context, AnyValue config) { - servlets.forEach(s -> s.init(context, getServletConf(s))); + getServlets().forEach(s -> s.init(context, getServletConf(s))); } @Override public void destroy(SncpContext context, AnyValue config) { - servlets.forEach(s -> s.destroy(context, getServletConf(s))); + getServlets().forEach(s -> s.destroy(context, getServletConf(s))); } @Override @@ -58,7 +54,7 @@ public class SncpPrepareServlet extends PrepareServlet