add options

This commit is contained in:
Looly 2024-11-24 20:55:49 +08:00
parent 1b80ed49e8
commit d63410e432
6 changed files with 211 additions and 20 deletions

View File

@ -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;
}
}

View File

@ -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());

View File

@ -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)

View File

@ -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);
}
});
}

View File

@ -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();
}
}

View File

@ -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) -> {