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

时间:2019-12-20 12:59:48

标签: java spring-boot undertow

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

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

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

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

为了限制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;
}

请帮助我解决这个问题。

0 个答案:

没有答案