2016-11-08 5 views
1

Я использую Spring Boot с Undertow и пытаюсь реализовать некоторые ограничения на количество запросов, которые Undertow примет, чтобы не перегружаться при стрессе.Spring Boot Undertow добавить RequestLimitingHandler в DeploymentInfo

Я видел ответ на вопрос в Spring Boot Undertow add both blocking handler and NIO handler in the same application, и он кажется многообещающим, но я не понимаю, что должен передать HttpHandler в качестве аргумента для конструктора RequestLimitingHandler.

Есть ли простой способ добавить RequestLimitingHandler в компонент UndertowEmbeddedServletContainerFactory, возможно, используя метод addDeploymentInfoCustomizers?

В качестве альтернативы, если я смотрю глубже и попадаю в код Xnio, на котором основан Undertow, похоже, что есть опция для установки Options.WORKER_TASK_LIMIT, но при дальнейшем расследовании похоже, что класс XnioWorker игнорирует этот параметр после релиз 3.0.10.GA и просто устанавливает taskQueue в неограниченный LinkedBlockingQueue. Я ошибаюсь, и может ли это быть вариантом?

ответ

1

Отвечая на мой собственный вопрос, если он поможет другим в будущем. Решение заключается в создании нового обработчика Undertow HandlerWrapper и создании нового объекта RequestLimitingHandler в методе wrap(), например:

@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; 
}