【发布时间】:2019-07-10 05:23:27
【问题描述】:
我只是回到Servlet-3.x 功能并探索它。如果我没记错的话,在 Servlet-3.x 之前,它是每个请求模型的线程,并且它会用完池中的线程,从而导致大量传入流量。
因此,对于 Servlet-3.x,它表示它是异步的并且不会保持线程被阻塞,而是立即释放它们,而只是委派任务。
这是我的解释,
考虑服务器线程池中有 2 个线程
对于一个新的 Async Servlet 请求 R1 有一个线程 T1,这个 T1 会将任务委托给 T2 并且 T1 会立即响应客户端。
问题: T2 是从服务器线程池创建的吗?如果是这样,我不明白这一点。
案例1:如果是旧的同步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 的这种异步行为吗
【问题讨论】:
标签: open-liberty java-ee-8 servlet-3.1