我只是回到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任务。
在两种情况下,其中一个都很忙。
我尝试在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的这种异步行为吗?
答案 0 :(得分:0)
在您的示例中,工作是同步的,并且没有单独的执行程序/线程池,因此几乎没有意义使用异步servlet。许多示例/示例在第二线程上只是块,因为它们试图仅说明语法。
但是没有理由您不能剥离线程来做一些工作,将异步上下文添加到某个列表中,然后在某些事件(入站JMS,websocket等)提供完成数据所需的数据之后异步响应。例如,一个2人游戏服务器不会在第二个线程中等待玩家2,而只会在内存中浮动它们的异步上下文,等待第二个玩家找到它。