From d63410e432cc57f02897fb76f8ba05df1df1c21f Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 24 Nov 2024 20:55:49 +0800 Subject: [PATCH] add options --- .../hutool/http/server/ServerConfig.java | 109 +++++++++++++++++- .../http/server/engine/jetty/JettyEngine.java | 35 +++++- .../engine/sun/SunHttpServerEngine.java | 22 +++- .../server/engine/tomcat/TomcatEngine.java | 27 ++++- .../engine/undertow/UndertowEngine.java | 36 +++++- .../hutool/http/server/engine/JettyTest.java | 2 +- 6 files changed, 211 insertions(+), 20 deletions(-) diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/server/ServerConfig.java b/hutool-http/src/main/java/org/dromara/hutool/http/server/ServerConfig.java index 0d9641c19..50c2c6f42 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/server/ServerConfig.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/server/ServerConfig.java @@ -30,7 +30,7 @@ public class ServerConfig { * * @return 配置 */ - public static ServerConfig of(){ + public static ServerConfig of() { return new ServerConfig(); } @@ -39,6 +39,13 @@ public class ServerConfig { private String root; private SSLContext sslContext; + private int maxHeaderSize; + private long maxBodySize; + private int coreThreads; + private int maxThreads; + private long idleTimeout; + + /** * 获取服务器地址,默认127.0.0.1 * @@ -118,4 +125,104 @@ public class ServerConfig { this.sslContext = sslContext; return this; } + + /** + * 获取最大请求(响应)头大小 + * + * @return maxHeaderSize 最大请求(响应)头大小 + */ + public int getMaxHeaderSize() { + return maxHeaderSize; + } + + /** + * 设置最大请求(响应)头大小 + * + * @param maxHeaderSize 最大请求(响应)头大小 + * @return this + */ + public ServerConfig setMaxHeaderSize(final int maxHeaderSize) { + this.maxHeaderSize = maxHeaderSize; + return this; + } + + /** + * 获取最大消息体大小 + * + * @return maxBodySize 最大消息体大小 + */ + public long getMaxBodySize() { + return maxBodySize; + } + + /** + * 设置最大消息体大小 + * + * @param maxBodySize 最大消息体大小 + * @return this + */ + public ServerConfig setMaxBodySize(final long maxBodySize) { + this.maxBodySize = maxBodySize; + return this; + } + + /** + * 获取核心线程数 + * + * @return coreThreads 核心线程数 + */ + public int getCoreThreads() { + return coreThreads; + } + + /** + * 设置核心线程数 + * + * @param coreThreads 核心线程数 + * @return this + */ + public ServerConfig setCoreThreads(final int coreThreads) { + this.coreThreads = coreThreads; + return this; + } + + /** + * 获取最大线程数 + * + * @return maxThreads 最大线程数 + */ + public int getMaxThreads() { + return maxThreads; + } + + /** + * 设置最大线程数 + * + * @param maxThreads 最大线程数 + * @return this + */ + public ServerConfig setMaxThreads(final int maxThreads) { + this.maxThreads = maxThreads; + return this; + } + + /** + * 获取空闲超时时间 + * + * @return idleTimeout 空闲超时时间 + */ + public long getIdleTimeout() { + return idleTimeout; + } + + /** + * 设置空闲超时时间 + * + * @param idleTimeout 空闲超时时间 + * @return this + */ + public ServerConfig setIdleTimeout(final long idleTimeout) { + this.idleTimeout = idleTimeout; + return this; + } } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/jetty/JettyEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/jetty/JettyEngine.java index ed0ccee54..56218856f 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/jetty/JettyEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/jetty/JettyEngine.java @@ -24,6 +24,7 @@ import org.dromara.hutool.http.server.engine.AbstractServerEngine; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.*; import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.eclipse.jetty.util.thread.QueuedThreadPool; import javax.net.ssl.SSLContext; @@ -91,8 +92,25 @@ public class JettyEngine extends AbstractServerEngine { } final ServerConfig config = this.config; - final Server server = new Server(); - server.addConnector(createConnector(server, config)); + + // 线程池 + final QueuedThreadPool threadPool = new QueuedThreadPool(); + threadPool.setName("Hutool"); + final int coreThreads = config.getCoreThreads(); + if(coreThreads > 0){ + threadPool.setMinThreads(coreThreads); + } + final int maxThreads = config.getMaxThreads(); + if(maxThreads > 0){ + threadPool.setMaxThreads(maxThreads); + } + final long idleTimeout = config.getIdleTimeout(); + if(idleTimeout > 0){ + threadPool.setIdleTimeout((int) idleTimeout); + } + + final Server server = new Server(threadPool); + server.addConnector(createConnector(server)); server.setHandler(ObjUtil.defaultIfNull(this.jettyHandler, () -> new Jetty9Handler(this.handler))); this.server = server; @@ -102,14 +120,19 @@ public class JettyEngine extends AbstractServerEngine { * 创建连接器 * * @param server 服务器 - * @param config 配置 * @return 连接器 */ - private ServerConnector createConnector(final Server server, final ServerConfig config) { + private ServerConnector createConnector(final Server server) { final ServerConnector connector; + final ServerConfig config = this.config; // 配置 final HttpConfiguration configuration = new HttpConfiguration(); + final int maxHeaderSize = config.getMaxHeaderSize(); + if(maxHeaderSize > 0){ + configuration.setRequestHeaderSize(maxHeaderSize); + } + final HttpConnectionFactory httpFactory = new HttpConnectionFactory(configuration); final SSLContext sslContext = config.getSslContext(); @@ -124,6 +147,10 @@ public class JettyEngine extends AbstractServerEngine { connector = new ServerConnector(server, httpFactory); } + final long idleTimeout = config.getIdleTimeout(); + if(idleTimeout > 0){ + connector.setIdleTimeout(idleTimeout); + } connector.setHost(config.getHost()); connector.setPort(config.getPort()); diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/sun/SunHttpServerEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/sun/SunHttpServerEngine.java index ce9f22981..016d13a1e 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/sun/SunHttpServerEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/sun/SunHttpServerEngine.java @@ -20,9 +20,9 @@ import com.sun.net.httpserver.*; import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.text.StrUtil; -import org.dromara.hutool.core.thread.GlobalThreadPool; -import org.dromara.hutool.http.server.engine.AbstractServerEngine; +import org.dromara.hutool.core.thread.ExecutorBuilder; import org.dromara.hutool.http.server.ServerConfig; +import org.dromara.hutool.http.server.engine.AbstractServerEngine; import org.dromara.hutool.http.server.engine.sun.filter.HttpFilter; import org.dromara.hutool.http.server.engine.sun.filter.SimpleFilter; @@ -157,7 +157,23 @@ public class SunHttpServerEngine extends AbstractServerEngine { } catch (final IOException e) { throw new IORuntimeException(e); } - setExecutor(GlobalThreadPool.getExecutor()); + + // 线程池 + final int coreThreads = config.getCoreThreads(); + final ExecutorBuilder executorBuilder = ExecutorBuilder.of(); + if(coreThreads > 0){ + executorBuilder.setCorePoolSize(coreThreads); + } + final int maxThreads = config.getMaxThreads(); + if(maxThreads > 0){ + executorBuilder.setMaxPoolSize(maxThreads); + } + final long idleTimeout = config.getIdleTimeout(); + if(idleTimeout > 0){ + executorBuilder.setKeepAliveTime(idleTimeout); + } + + setExecutor(executorBuilder.build()); createContext("/", exchange -> SunHttpServerEngine.this.handler.handle( new SunServerRequest(exchange), new SunServerResponse(exchange) diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/tomcat/TomcatEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/tomcat/TomcatEngine.java index 0556f51ff..8b35b8fdb 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/tomcat/TomcatEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/tomcat/TomcatEngine.java @@ -23,14 +23,13 @@ import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.valves.ValveBase; +import org.apache.coyote.http11.Http11NioProtocol; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.http.HttpException; +import org.dromara.hutool.http.server.ServerConfig; import org.dromara.hutool.http.server.engine.AbstractServerEngine; -import javax.servlet.ServletException; -import java.io.IOException; - /** * Tomcat引擎实现 * @@ -103,8 +102,24 @@ public class TomcatEngine extends AbstractServerEngine { * @param tomcat Tomcat */ private void initConnector(final Tomcat tomcat) { - final Connector connector = new Connector(); + final ServerConfig config = this.config; + final Http11NioProtocol protocol = new Http11NioProtocol(); + final int maxHeaderSize = config.getMaxHeaderSize(); + if(maxHeaderSize > 0){ + protocol.setMaxHttpHeaderSize(maxHeaderSize); + } + final int maxThreads = config.getMaxThreads(); + if(maxThreads > 0){ + protocol.setMaxThreads(maxThreads); + } + + final Connector connector = new Connector(protocol); connector.setPort(config.getPort()); + final int maxBodySize = (int) config.getMaxBodySize(); + if(maxBodySize > 0){ + connector.setMaxPostSize(maxBodySize); + } + tomcat.setConnector(connector); } @@ -117,9 +132,9 @@ public class TomcatEngine extends AbstractServerEngine { final Context context = tomcat.addContext(StrUtil.EMPTY, null); context.getPipeline().addValve(new ValveBase() { @Override - public void invoke(final Request request, final Response response) throws IOException, ServletException { + public void invoke(final Request request, final Response response) { handler.handle(new TomcatRequest(request), new TomcatResponse(response)); - getNext().invoke(request, response); + //getNext().invoke(request, response); } }); } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/undertow/UndertowEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/undertow/UndertowEngine.java index 66ee18676..b074c9a78 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/undertow/UndertowEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/server/engine/undertow/UndertowEngine.java @@ -17,7 +17,9 @@ package org.dromara.hutool.http.server.engine.undertow; import io.undertow.Undertow; +import io.undertow.UndertowOptions; import org.dromara.hutool.core.lang.Assert; +import org.dromara.hutool.http.server.ServerConfig; import org.dromara.hutool.http.server.engine.AbstractServerEngine; import javax.net.ssl.SSLContext; @@ -71,12 +73,36 @@ public class UndertowEngine extends AbstractServerEngine { new UndertowResponse(exchange)); }); - final SSLContext sslContext = this.config.getSslContext(); - if(null != sslContext){ - builder.addHttpsListener(this.config.getPort(), this.config.getHost(), sslContext); - }else{ - builder.addHttpListener(this.config.getPort(), this.config.getHost()); + final ServerConfig config = this.config; + // 选项 + final int maxHeaderSize = config.getMaxHeaderSize(); + if(maxHeaderSize > 0){ + builder.setServerOption(UndertowOptions.MAX_HEADER_SIZE, maxHeaderSize); } + final long maxBodySize = config.getMaxBodySize(); + if(maxBodySize > 0){ + builder.setServerOption(UndertowOptions.MAX_ENTITY_SIZE, maxBodySize); + } + final long idleTimeout = config.getIdleTimeout(); + if(idleTimeout > 0){ + builder.setServerOption(UndertowOptions.IDLE_TIMEOUT, (int)idleTimeout); + } + final int coreThreads = config.getCoreThreads(); + if(coreThreads > 0){ + builder.setIoThreads(coreThreads); + } + final int maxThreads = config.getMaxThreads(); + if(maxThreads > 0){ + builder.setWorkerThreads(maxThreads); + } + + final SSLContext sslContext = config.getSslContext(); + if(null != sslContext){ + builder.addHttpsListener(config.getPort(), config.getHost(), sslContext); + }else{ + builder.addHttpListener(config.getPort(), config.getHost()); + } + this.undertow = builder.build(); } } diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/server/engine/JettyTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/server/engine/JettyTest.java index 065457007..46495acb6 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/server/engine/JettyTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/server/engine/JettyTest.java @@ -4,7 +4,7 @@ import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.http.server.ServerConfig; public class JettyTest { - public static void main(String[] args) { + public static void main(final String[] args) { final ServerEngine engine = ServerEngineFactory.createEngine("jetty"); engine.init(ServerConfig.of()); engine.setHandler((request, response) -> {