【问题标题】:Async feature in ServletsServlet 中的异步功能
【发布时间】:2019-07-10 05:23:27
【问题描述】:

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

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

这是我的解释,

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

对于一个新的 Async 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 的这种异步行为吗

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多