繁体   English   中英

Servlet中的异步功能

[英]Async feature in Servlets

我只是回到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进行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 ,但是我不确定它们是否来自App Server线程池。 如果是这样,为什么不能仅由Default Executor-thread-116执行任务而不是委派?

有人可以阐明JavaEE中Servlet的这种异步行为吗

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM