2016-11-08 127 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; 
} 
相關問題