我只是回到Servlet-3.x
功能并探索它。如果我没记错的话,在 Servlet-3.x 之前,它是每个请求模型的线程,并且由于传入流量大,它会耗尽池中的线程。
因此,对于Servlet-3.x,它说它是异步的,并且不会阻止线程,而是立即释放它们,但只是委派了任务。
这是我的解释,
假设服务器线程池中有 2 个线程
对于一个新的异步 Servlet 请求,R1
有一个线程T1
,这个T1
会将任务委托给T2
,T1
立即响应客户端。
问:T2
是从服务器线程池创建的吗?如果是这样,我不明白重点。
-
情况 1:如果是旧的同步 Servlet 请求
T1
会忙于运行 I/O 任务, -
情况 2:如果是异步 Servlet 调用
T2
正忙于运行 I/O 任务。 -
在这两种情况下,其中一个都很忙。
我试图使用应用程序服务器中的示例异步 servlet 检查openliberty
相同的内容,下面是从我的示例演示 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
,但我不确定它们是否来自应用程序服务器线程池。如果是这样,为什么不能只Default Executor-thread-116
完成任务而不是委派?
有人可以对JavaEE中Servlets的这种异步行为有所了解
吗?在你的例子中,工作是同步的,没有单独的执行器/线程池,使用异步 servlet 几乎没有意义。 那里的许多示例/示例只是在第二个线程上阻塞,因为它们试图说明语法。
但是没有理由不能剥离一个线程来做一些工作,将你的异步上下文添加到某个列表中,然后在某个事件(入站 JMS、websocket 等)之后提供完成异步响应所需的数据。 例如,一个 2 人游戏服务器不会在第二个线程中等待玩家 2,它只会让他们的异步上下文在内存中浮动,等待第二个玩家找到它。