From eb57a256989ff5482c834be81a1e758ec6dd4818 Mon Sep 17 00:00:00 2001
From: Redkale <22250530@qq.com>
Date: Wed, 22 Mar 2017 11:56:21 +0800
Subject: [PATCH] =?UTF-8?q?PrepareServlet.addServlet=E6=96=B9=E6=B3=95?=
=?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/org/redkale/net/PrepareServlet.java | 30 +++++++++++++++++--
.../redkale/net/http/HttpPrepareServlet.java | 13 ++++----
.../redkale/net/sncp/SncpPrepareServlet.java | 16 ++++------
3 files changed, 40 insertions(+), 19 deletions(-)
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