使用request.startAsync()
,asyncContext
可以获得start()
Runnable
。从那里,servlet容器管理传递Runnable
的生命周期,而原始线程完成并返回池中。
我是否应该依赖于Queue
的servlet-container管理?或者最好创建(例如)上下文范围的asyncContext
并使用例如执行程序的固定线程池来处理创建{{1}}(实际上没有启动它们)?
通过这种方式,我可以更好地控制异步工作和可配置线程(如果您可以通过规范在servlet容器上配置它,我不知道吗?)
答案 0 :(得分:0)
我的理解是你需要自己处理生成的Runnables,方法是将它们传递给Executor / ExecutorService。这不是servlet容器将为您处理的事情。
通过询问AsyncContext,你实际上是在告诉servlet容器不要保留一个线程来处理这个请求,并且你将在Runnable中执行(在旧的同步世界中)执行的最终响应生成。 AsyncContext。此时,您可以看到Runnable运行,并生成响应。但它如何执行取决于你:排队,优先级,线程池大小等。
我说像具有队列的ThreadPoolExecutor之类的东西会运行良好。这样,如果您想在当前正在进行的数量达到特定大小时开始拒绝请求,您可以自己选择如何执行此操作(服务重载响应或类似操作)。