2016-11-08 125 views
1

我在Undertow中使用Spring Boot并试图对Undertow将接受的请求数量实施一些限制,以免在压力下过载。Spring Boot Undertow将RequestLimitingHandler添加到DeploymentInfo

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

有没有一种简单的方法可以使用addDeploymentInfoCustomizers方法将RequestLimitingHandler添加到UndertowEmbeddedServletContainerFactory bean?或者,如果我更深入地观察Undertow所基于的Xnio代码,它看起来像有一个选项可以设置Options.WORKER_TASK_LIMIT,但经过进一步调查后,它看起来像XnioWorker类在忽略此设置之后3.0.10.GA版本并简单地将taskQueue设置为一个无界的LinkedBlockingQueue。我错了吗,这也可以是一个选择吗?

回答

1

回答我自己的问题,以防将来帮助他人。解决方案是创建一个新的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; 
} 
相关问题