我的主要目标是为Undertow设置最大并发请求连接数限制。
我试图通过属性通过配置进行设置。但这不起作用。
我研究了如何限制每个请求的最大连接数,并发现了以下内容:
为了限制underwow中的连接,必须实现RequestLimitHandler和RequestLimit。
“请求限制处理程序 限制并发请求数的处理程序。如果数量超出限制,则将请求排队。如果队列已满,则请求将被拒绝。”
http://undertow.io/undertow-docs/undertow-docs-1.2.0/#built-in-handlers
我已经尝试了下一个实现,但是此处理程序不会限制请求,因为它不会返回错误503响应,并且我无法与MVC方法绑定。
1. Test case:
@Bean
public UndertowServletWebServerFactory myUndertowServletWebServerFactory() {
final UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
final HandlerWrapper handlerWrapperLimit = new HandlerWrapper() {
@Override
public HttpHandler wrap(final HttpHandler handler) {
final int maximumConcurrentRequests = 1;
final int queueSize = 100;
final RequestLimit requestLimit = new RequestLimit(maximumConcurrentRequests,
queueSize);
final RequestLimitingHandler limitHandler = new RequestLimitingHandler(requestLimit,
new ResponseCodeHandler(
StatusCodes.OK));
return limitHandler;
}
};
factory.addDeploymentInfoCustomizers(info -> info.addInitialHandlerChainWrapper(handlerWrapperLimit));
return factory;
}
2. Test case:
@Bean
public UndertowServletWebServerFactory myUndertowServletWebServerFactory() {
final UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
final HandlerWrapper handlerWrapperLimit = new HandlerWrapper() {
@Override
public HttpHandler wrap(final HttpHandler handler) {
final int maximumConcurrentRequests = 1;
final int queueSize = 100;
final RequestLimit requestLimit = new RequestLimit(maximumConcurrentRequests,
queueSize);
requestLimit.setFailureHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
final ResponseCodeHandler responseCodeHandler = new ResponseCodeHandler(
StatusCodes.SERVICE_UNAVAILABLE);
exchange.dispatch(responseCodeHandler);
}
});
final RequestLimitingHandler limitHandler = new RequestLimitingHandler(requestLimit,
new HttpHandler() { //Default Handler
@Override
public void handleRequest(final HttpServerExchange exchange) throws Exception {
exchange.dispatch(new ResponseCodeHandler(StatusCodes.OK));
}
});
return limitHandler;
}
};
factory.addDeploymentInfoCustomizers(info -> info.addInitialHandlerChainWrapper(handlerWrapperLimit));
return factory;
}
请帮助我解决这个问题。