mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
add options
This commit is contained in:
parent
1b80ed49e8
commit
d63410e432
@ -30,7 +30,7 @@ public class ServerConfig {
|
|||||||
*
|
*
|
||||||
* @return 配置
|
* @return 配置
|
||||||
*/
|
*/
|
||||||
public static ServerConfig of(){
|
public static ServerConfig of() {
|
||||||
return new ServerConfig();
|
return new ServerConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +39,13 @@ public class ServerConfig {
|
|||||||
private String root;
|
private String root;
|
||||||
private SSLContext sslContext;
|
private SSLContext sslContext;
|
||||||
|
|
||||||
|
private int maxHeaderSize;
|
||||||
|
private long maxBodySize;
|
||||||
|
private int coreThreads;
|
||||||
|
private int maxThreads;
|
||||||
|
private long idleTimeout;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取服务器地址,默认127.0.0.1
|
* 获取服务器地址,默认127.0.0.1
|
||||||
*
|
*
|
||||||
@ -118,4 +125,104 @@ public class ServerConfig {
|
|||||||
this.sslContext = sslContext;
|
this.sslContext = sslContext;
|
||||||
return this;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import org.dromara.hutool.http.server.engine.AbstractServerEngine;
|
|||||||
import org.eclipse.jetty.http.HttpVersion;
|
import org.eclipse.jetty.http.HttpVersion;
|
||||||
import org.eclipse.jetty.server.*;
|
import org.eclipse.jetty.server.*;
|
||||||
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
@ -91,8 +92,25 @@ public class JettyEngine extends AbstractServerEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final ServerConfig config = this.config;
|
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,
|
server.setHandler(ObjUtil.defaultIfNull(this.jettyHandler,
|
||||||
() -> new Jetty9Handler(this.handler)));
|
() -> new Jetty9Handler(this.handler)));
|
||||||
this.server = server;
|
this.server = server;
|
||||||
@ -102,14 +120,19 @@ public class JettyEngine extends AbstractServerEngine {
|
|||||||
* 创建连接器
|
* 创建连接器
|
||||||
*
|
*
|
||||||
* @param server 服务器
|
* @param server 服务器
|
||||||
* @param config 配置
|
|
||||||
* @return 连接器
|
* @return 连接器
|
||||||
*/
|
*/
|
||||||
private ServerConnector createConnector(final Server server, final ServerConfig config) {
|
private ServerConnector createConnector(final Server server) {
|
||||||
final ServerConnector connector;
|
final ServerConnector connector;
|
||||||
|
final ServerConfig config = this.config;
|
||||||
|
|
||||||
// 配置
|
// 配置
|
||||||
final HttpConfiguration configuration = new HttpConfiguration();
|
final HttpConfiguration configuration = new HttpConfiguration();
|
||||||
|
final int maxHeaderSize = config.getMaxHeaderSize();
|
||||||
|
if(maxHeaderSize > 0){
|
||||||
|
configuration.setRequestHeaderSize(maxHeaderSize);
|
||||||
|
}
|
||||||
|
|
||||||
final HttpConnectionFactory httpFactory = new HttpConnectionFactory(configuration);
|
final HttpConnectionFactory httpFactory = new HttpConnectionFactory(configuration);
|
||||||
|
|
||||||
final SSLContext sslContext = config.getSslContext();
|
final SSLContext sslContext = config.getSslContext();
|
||||||
@ -124,6 +147,10 @@ public class JettyEngine extends AbstractServerEngine {
|
|||||||
connector = new ServerConnector(server, httpFactory);
|
connector = new ServerConnector(server, httpFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final long idleTimeout = config.getIdleTimeout();
|
||||||
|
if(idleTimeout > 0){
|
||||||
|
connector.setIdleTimeout(idleTimeout);
|
||||||
|
}
|
||||||
connector.setHost(config.getHost());
|
connector.setHost(config.getHost());
|
||||||
connector.setPort(config.getPort());
|
connector.setPort(config.getPort());
|
||||||
|
|
||||||
|
@ -20,9 +20,9 @@ import com.sun.net.httpserver.*;
|
|||||||
import org.dromara.hutool.core.collection.CollUtil;
|
import org.dromara.hutool.core.collection.CollUtil;
|
||||||
import org.dromara.hutool.core.io.IORuntimeException;
|
import org.dromara.hutool.core.io.IORuntimeException;
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
import org.dromara.hutool.core.text.StrUtil;
|
||||||
import org.dromara.hutool.core.thread.GlobalThreadPool;
|
import org.dromara.hutool.core.thread.ExecutorBuilder;
|
||||||
import org.dromara.hutool.http.server.engine.AbstractServerEngine;
|
|
||||||
import org.dromara.hutool.http.server.ServerConfig;
|
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.HttpFilter;
|
||||||
import org.dromara.hutool.http.server.engine.sun.filter.SimpleFilter;
|
import org.dromara.hutool.http.server.engine.sun.filter.SimpleFilter;
|
||||||
|
|
||||||
@ -157,7 +157,23 @@ public class SunHttpServerEngine extends AbstractServerEngine {
|
|||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new IORuntimeException(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(
|
createContext("/", exchange -> SunHttpServerEngine.this.handler.handle(
|
||||||
new SunServerRequest(exchange),
|
new SunServerRequest(exchange),
|
||||||
new SunServerResponse(exchange)
|
new SunServerResponse(exchange)
|
||||||
|
@ -23,14 +23,13 @@ import org.apache.catalina.connector.Request;
|
|||||||
import org.apache.catalina.connector.Response;
|
import org.apache.catalina.connector.Response;
|
||||||
import org.apache.catalina.startup.Tomcat;
|
import org.apache.catalina.startup.Tomcat;
|
||||||
import org.apache.catalina.valves.ValveBase;
|
import org.apache.catalina.valves.ValveBase;
|
||||||
|
import org.apache.coyote.http11.Http11NioProtocol;
|
||||||
import org.dromara.hutool.core.lang.Assert;
|
import org.dromara.hutool.core.lang.Assert;
|
||||||
import org.dromara.hutool.core.text.StrUtil;
|
import org.dromara.hutool.core.text.StrUtil;
|
||||||
import org.dromara.hutool.http.HttpException;
|
import org.dromara.hutool.http.HttpException;
|
||||||
|
import org.dromara.hutool.http.server.ServerConfig;
|
||||||
import org.dromara.hutool.http.server.engine.AbstractServerEngine;
|
import org.dromara.hutool.http.server.engine.AbstractServerEngine;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tomcat引擎实现
|
* Tomcat引擎实现
|
||||||
*
|
*
|
||||||
@ -103,8 +102,24 @@ public class TomcatEngine extends AbstractServerEngine {
|
|||||||
* @param tomcat Tomcat
|
* @param tomcat Tomcat
|
||||||
*/
|
*/
|
||||||
private void initConnector(final 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());
|
connector.setPort(config.getPort());
|
||||||
|
final int maxBodySize = (int) config.getMaxBodySize();
|
||||||
|
if(maxBodySize > 0){
|
||||||
|
connector.setMaxPostSize(maxBodySize);
|
||||||
|
}
|
||||||
|
|
||||||
tomcat.setConnector(connector);
|
tomcat.setConnector(connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,9 +132,9 @@ public class TomcatEngine extends AbstractServerEngine {
|
|||||||
final Context context = tomcat.addContext(StrUtil.EMPTY, null);
|
final Context context = tomcat.addContext(StrUtil.EMPTY, null);
|
||||||
context.getPipeline().addValve(new ValveBase() {
|
context.getPipeline().addValve(new ValveBase() {
|
||||||
@Override
|
@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));
|
handler.handle(new TomcatRequest(request), new TomcatResponse(response));
|
||||||
getNext().invoke(request, response);
|
//getNext().invoke(request, response);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,9 @@
|
|||||||
package org.dromara.hutool.http.server.engine.undertow;
|
package org.dromara.hutool.http.server.engine.undertow;
|
||||||
|
|
||||||
import io.undertow.Undertow;
|
import io.undertow.Undertow;
|
||||||
|
import io.undertow.UndertowOptions;
|
||||||
import org.dromara.hutool.core.lang.Assert;
|
import org.dromara.hutool.core.lang.Assert;
|
||||||
|
import org.dromara.hutool.http.server.ServerConfig;
|
||||||
import org.dromara.hutool.http.server.engine.AbstractServerEngine;
|
import org.dromara.hutool.http.server.engine.AbstractServerEngine;
|
||||||
|
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
@ -71,12 +73,36 @@ public class UndertowEngine extends AbstractServerEngine {
|
|||||||
new UndertowResponse(exchange));
|
new UndertowResponse(exchange));
|
||||||
});
|
});
|
||||||
|
|
||||||
final SSLContext sslContext = this.config.getSslContext();
|
final ServerConfig config = this.config;
|
||||||
if(null != sslContext){
|
// 选项
|
||||||
builder.addHttpsListener(this.config.getPort(), this.config.getHost(), sslContext);
|
final int maxHeaderSize = config.getMaxHeaderSize();
|
||||||
}else{
|
if(maxHeaderSize > 0){
|
||||||
builder.addHttpListener(this.config.getPort(), this.config.getHost());
|
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();
|
this.undertow = builder.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import org.dromara.hutool.core.lang.Console;
|
|||||||
import org.dromara.hutool.http.server.ServerConfig;
|
import org.dromara.hutool.http.server.ServerConfig;
|
||||||
|
|
||||||
public class JettyTest {
|
public class JettyTest {
|
||||||
public static void main(String[] args) {
|
public static void main(final String[] args) {
|
||||||
final ServerEngine engine = ServerEngineFactory.createEngine("jetty");
|
final ServerEngine engine = ServerEngineFactory.createEngine("jetty");
|
||||||
engine.init(ServerConfig.of());
|
engine.init(ServerConfig.of());
|
||||||
engine.setHandler((request, response) -> {
|
engine.setHandler((request, response) -> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user