Undertow 按应用程序属性设置每个连接的最大并发请求数

jcl*_*ent 5 java spring-boot undertow

我的主要目标是设置 Undertow 的最大并发请求连接限制。

我尝试通过属性进行配置来设置它。但这不起作用。

  • application.yml undertow:工作线程:1 io线程:1选项:服务器:MAX_CONCURRENT_REQUESTS_PER_CONNECTION:1

我研究了如何限制每个请求的最大连接数,并发现以下内容:

为了限制 undertow 中的连接,有必要实现 RequestLimitHandler 和 RequestLimit。

“Request Limiting Handler 限制并发请求数量的处理程序。如果数量超过限制,请求将排队。如果队列已满,则请求将被拒绝。”

http://undertow.io/undertow-docs/undertow-docs-1.2.0/#built-in-handlers
Run Code Online (Sandbox Code Playgroud)

我已经尝试了下一个实现,但此处理程序不会限制请求,因为它不会返回错误 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;
}
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题。