0

我只是回到Servlet-3.x功能并探索它。如果我没记错的话,在 Servlet-3.x 之前,它是每个请求模型的线程,并且它会用完池中的线程,从而导致大量传入流量。

因此,对于 Servlet-3.x,它说它是异步的并且不会保持线程被阻塞,而是立即释放它们,而只是委派了任务。

这是我的解释,

考虑服务器线程池中有 2 个线程

对于新的 Async Servlet 请求R1,有一个线程T1,这T1会将任务委托给客户端T2T1立即响应客户端。

问题: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 的这种异步行为有所了解吗

4

1 回答 1

0

在您的示例中,工作是同步的并且没有单独的执行程序/线程池,几乎没有必要使用异步 servlet。那里的许多示例/示例只是阻塞在第二个线程上,因为它们只是试图说明语法。

但是没有理由你不能分离一个线程来做一些工作,将你的异步上下文添加到某个列表中,然后在某些事件(入站 JMS、websocket 等)之后提供完成异步响应所需的数据。例如,一个 2 玩家游戏服务器不会在第二个线程中等待玩家 2,它只会让他们的异步上下文在内存中浮动,等待第二个玩家找到它。

于 2019-07-09T21:23:27.530 回答