diff --git a/src/META-INF/application-template.xml b/src/META-INF/application-template.xml index 6bd556fde..d6e2158a6 100644 --- a/src/META-INF/application-template.xml +++ b/src/META-INF/application-template.xml @@ -107,6 +107,7 @@ charset: 文本编码, 默认: UTF-8 backlog: 默认10K threads: 线程总数, 默认: CPU核数*16 + maxconns:最大连接数, 小于1表示无限制, 默认: 0 maxbody: request.body最大值, 默认: 64K bufferCapacity: ByteBuffer的初始化大小, 默认: 8K; 如果是HTTP协议则默认: 16K + 16B (兼容HTTP 2.0、WebSocket) bufferPoolSize: ByteBuffer池的大小,默认: CPU核数*512 diff --git a/src/org/redkale/net/AsyncConnection.java b/src/org/redkale/net/AsyncConnection.java index ec63bf175..fb998423e 100644 --- a/src/org/redkale/net/AsyncConnection.java +++ b/src/org/redkale/net/AsyncConnection.java @@ -31,10 +31,10 @@ public abstract class AsyncConnection implements AsynchronousByteChannel, AutoCl protected volatile long writetime; //关闭数 - AtomicLong closedCounter = new AtomicLong(); + AtomicLong closedCounter; //在线数 - AtomicLong livingCounter = new AtomicLong(); + AtomicLong livingCounter; public final long getLastReadTime() { return readtime; diff --git a/src/org/redkale/net/ProtocolServer.java b/src/org/redkale/net/ProtocolServer.java index dd3eaa3d1..b48e08aa9 100644 --- a/src/org/redkale/net/ProtocolServer.java +++ b/src/org/redkale/net/ProtocolServer.java @@ -32,6 +32,9 @@ public abstract class ProtocolServer { //在线数 protected final AtomicLong livingCounter = new AtomicLong(); + //最大连接数,小于1表示无限制 + protected int maxconns; + public abstract void open() throws IOException; public abstract void bind(SocketAddress local, int backlog) throws IOException; @@ -42,6 +45,10 @@ public abstract class ProtocolServer { public abstract void accept(); + public void setMaxconns(int maxconns) { + this.maxconns = maxconns; + } + public abstract void close() throws IOException; public abstract AsynchronousChannelGroup getChannelGroup(); @@ -198,6 +205,13 @@ public abstract class ProtocolServer { @Override public void completed(final AsynchronousSocketChannel channel, Void attachment) { serchannel.accept(null, this); + if (maxconns > 0 && livingCounter.get() >= maxconns) { + try { + channel.close(); + } catch (Exception e) { + } + return; + } createCounter.incrementAndGet(); livingCounter.incrementAndGet(); AsyncConnection conn = AsyncConnection.create(channel, null, context.readTimeoutSecond, context.writeTimeoutSecond); diff --git a/src/org/redkale/net/Server.java b/src/org/redkale/net/Server.java index 4b801e9ef..d2db3fdf9 100644 --- a/src/org/redkale/net/Server.java +++ b/src/org/redkale/net/Server.java @@ -88,6 +88,9 @@ public abstract class Server servlet) { this.serverStartTime = serverStartTime; this.protocol = protocol; @@ -99,6 +102,7 @@ public abstract class Server { final Thread t = new Thread(r, engineid + "-WebSocket-LiveInterval-Thread"); @@ -99,7 +99,7 @@ public class WebSocketEngine { long now = System.currentTimeMillis(); getLocalWebSockets().stream().filter(x -> (now - x.getLastSendTime()) > intervalms).forEach(x -> x.sendPing()); }, delay, liveinterval, TimeUnit.SECONDS); - if (logger.isLoggable(Level.FINEST)) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", maxconns:" + maxconns + ", interval:" + liveinterval + "s) scheduler executor"); + if (logger.isLoggable(Level.FINEST)) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", wsmaxconns:" + wsmaxconns + ", interval:" + liveinterval + "s) scheduler executor"); } void destroy(AnyValue conf) { @@ -274,14 +274,14 @@ public class WebSocketEngine { } @Comment("获取最大连接数") - public int getLocalMaxconns() { - return this.maxconns; + public int getLocalWsmaxconns() { + return this.wsmaxconns; } @Comment("连接数是否达到上限") public boolean isLocalConnLimited() { - if (this.maxconns < 1) return false; - return currconns.get() >= this.maxconns; + if (this.wsmaxconns < 1) return false; + return currconns.get() >= this.wsmaxconns; } @Comment("获取所有连接") diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index 8477a4aa0..027bebbc5 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -46,7 +46,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl public static final String WEBPARAM__LIVEINTERVAL = "liveinterval"; @Comment("WebScoket服务器最大连接数,为0表示无限制") - public static final String WEBPARAM__MAXCONNS = "maxconns"; + public static final String WEBPARAM__WSMAXCONNS = "wsmaxconns"; @Comment("WebScoket服务器给客户端进行ping操作的默认间隔时间, 单位: 秒") public static final int DEFAILT_LIVEINTERVAL = 15; @@ -144,7 +144,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl return; } if (this.node.localEngine.isLocalConnLimited()) { - if (debug) logger.finest("WebSocket connections limit, maxconns=" + this.node.localEngine.getLocalMaxconns()); + if (debug) logger.finest("WebSocket connections limit, wsmaxconns=" + this.node.localEngine.getLocalWsmaxconns()); response.finish(true); return; }