我只是回到Servlet-3.x
功能并探索它。如果我没记错的话,在 Servlet-3.x 之前,它是每个请求模型的线程,并且它会用完池中的线程,从而导致大量传入流量。
因此,对于 Servlet-3.x,它说它是异步的并且不会保持线程被阻塞,而是立即释放它们,而只是委派了任务。
这是我的解释,
考虑服务器线程池中有 2 个线程
对于新的 Async Servlet 请求R1
,有一个线程T1
,这T1
会将任务委托给客户端T2
并T1
立即响应客户端。
问题:是T2
从服务器线程池创建的吗?如果是这样,我不明白这一点。
情况1:如果是旧的Synchronous Servlet 请求
T1
会一直忙于运行I/O 任务,情况2:如果是异步Servlet调用
T2
正忙于运行I/O任务。在这两种情况下,其中一个都很忙。
我尝试使用openliberty
应用服务器中的示例异步 servlet 进行检查,下面是从我的示例演示 Servlet 中捕获的示例日志。
Entering doGet() == thread name is = Default Executor-thread-116
Exiting doGet() == thread name is = Default Executor-thread-116
=== Long running task started ===
Thread executing @start of long running task = Default Executor-thread-54
Thread executing @end of long running task = Default Executor-thread-54
=== Long running task ended ===
如上所示,Default Executor-thread-116
立即释放并将长时间运行的任务委托给Default Executor-thread-54
,但我不确定它们是否来自 App Server 线程池。如果是这样,为什么不能只做Default Executor-thread-116
任务而不是委派?
有人可以对 JavaEE 中 Servlet 的这种异步行为有所了解吗