Spring Boot Undertow 将 RequestLimitingHandler 添加到 DeploymentInfo

Spring Boot Undertow add RequestLimitingHandler to DeploymentInfo

我正在使用 Spring Boot with Undertow 并尝试对 Undertow 将接受的请求数量实施一些限制,以免在压力下变得过载。

我在 Spring Boot Undertow add both blocking handler and NIO handler in the same application 看到了问题的答案,看起来很有希望,但我不清楚应该将什么 HttpHandler 作为参数传递给 RequestLimitingHandler 构造函数。

是否有一种简单的方法可以将 RequestLimitingHandler 添加到 UndertowEmbeddedServletContainerFactory bean,也许使用 addDeploymentInfoCustomizers 方法?

或者,如果我深入了解 Undertow 所基于的 Xnio 代码,似乎有一个选项可以设置 Options.WORKER_TASK_LIMIT,但经过进一步调查,它看起来像 XnioWorker class 在 3.0.10.GA 版本后忽略此设置,并简单地将 taskQueue 设置为无界 LinkedBlockingQueue。我是不是弄错了,这也可以是一个选项吗?

回答我自己的问题,以防将来对其他人有所帮助。解决方案是创建一个新的 Undertow HandlerWrapper 并在 wrap() 方法中实例化新的 RequestLimitingHandler 对象,如下所示:

@Bean
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory(RootHandler rootHandler) {
    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();

    factory.addDeploymentInfoCustomizers(deploymentInfo -> deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() {

        @Override
        public HttpHandler wrap(HttpHandler handler) {
            return new RequestLimitingHandler(maxConcurrentRequests, queueSize, handler);
        }

    }));

    return factory;
}