在servlet容器中创建新线程时的最佳实践是什么?



今天我正在看一些web应用程序代码,它们使用Executors.newSingleThreadScheduledExecutor()在每个请求的基础上轮询REST API以获得最终状态(想想COMPLETE,FAILED等)。知道servlet容器已经是一个高度并发的环境后,我担心每个请求线程都在创建另一个线程。

我看过创建一个固定大小的线程池,但我不确定它是否必须以servlet容器特定的方式进行管理。我不确定如何决定最佳尺寸。我也不完全相信这是正确的行动方针。

我想确认这确实是危险的,并解释为什么,并理解一个更好的解决方案可能是什么样子的。

servletAsyncContext.start(Runnable)是首选的方式,如果你想与servlet API和上下文从你的Runnable(这将在servlet容器的线程池中运行,并允许容器管理你的线程周围的各种上下文,如类加载器,安全性,cdi,会话等)进行交互。

AsyncContext方法的唯一缺点是你正在消耗Servlet容器线程来做你的处理。如果您还使用Servlet异步I/O,那么您已经以一种宏伟的方式抵消了这一负面影响,并且您实际上将在扩展能力方面获得明显的改进。

如果您不需要与来自Runnable的Servlet API进行交互,那么使用从JavaExecutors获得的线程池执行的简单线程。

相关内容

最新更新