Servlet中的异步功能

时间:2019-07-09 19:51:55

标签: open-liberty java-ee-8 servlet-3.1

我只是回到Servlet-3.x功能并进行了探索。如果我没看错,则在Servlet-3.x之前,它是每个请求模型的线程,它将耗尽池中的线程,从而导致大量传入流量。

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

这是我的解释,

  

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

对于新的异步Servlet请求R1,有一个线程T1,该T1会将任务委派给T2T1会返回给客户端立即。

问题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的这种异步行为吗?

1 个答案:

答案 0 :(得分:0)

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

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