我应该管理我的异步任务还是让容器这样做(servlets 3)

时间:2014-03-31 09:07:34

标签: java servlets servlet-3.0

使用request.startAsync()asyncContext可以获得start() Runnable。从那里,servlet容器管理传递Runnable的生命周期,而原始线程完成并返回池中。

我是否应该依赖于Queue的servlet-container管理?或者最好创建(例如)上下文范围的asyncContext并使用例如执行程序的固定线程池来处理创建{{1}}(实际上没有启动它们)?

通过这种方式,我可以更好地控制异步工作和可配置线程(如果您可以通过规范在servlet容器上配置它,我不知道吗?)

1 个答案:

答案 0 :(得分:0)

我的理解是你需要自己处理生成的Runnables,方法是将它们传递给Executor / ExecutorService。这不是servlet容器将为您处理的事情。

通过询问AsyncContext,你实际上是在告诉servlet容器不要保留一个线程来处理这个请求,并且你将在Runnable中执行(在旧的同步世界中)执行的最终响应生成。 AsyncContext。此时,您可以看到Runnable运行,并生成响应。但它如何执行取决于你:排队,优先级,线程池大小等。

我说像具有队列的ThreadPoolExecutor之类的东西会运行良好。这样,如果您想在当前正在进行的数量达到特定大小时开始拒绝请求,您可以自己选择如何执行此操作(服务重载响应或类似操作)。