Async Servlets有什么好处

时间:2014-11-28 20:44:50

标签: java-ee servlet-3.1

我正在阅读Async servlets 3.1

据说,当需要进行大量耗时的操作时,释放发送请求的线程。从数据库中获取长数据列表。

我无法理解这里的好处,因为无论如何都会分配一个新的线程来处理数据库连接和响应处理,即使释放了负责该请求的初始线程。

那么Async servlet如何比我们之前使用的每个请求模型更有益。

2 个答案:

答案 0 :(得分:1)

在这里分两部分回答:

  1. Async servlet如何比我们之前使用的每个请求模型更有用:这个模型已经很久了,几乎所有的Java服务器都使用NIO,这允许这些服务器使用NIO来处理数百个连接少数线程。您也可以为您的应用服务器验证这一点,您会惊喜地发现 使用NIO :)。 Async Servlets与每个线程的一个请求没有任何关系。
  2. 那么为什么Async Servlets :嗯, Async Servlets 允许原始请求完成,而无需等待异步任务完成(希望长期运行)。因此,远程客户端可以立即响应,如果必须,他们可以做一些其他的事情。稍后在其中一个线程中,服务器可以处理异步任务。这些异步操作通常在单独的线程池中完成,用于异步操作。用于处理客户端连接的线程池用于异步操作。
  3. 更新:如果我们已经在使用NIO线程池,我们需要Async Servlets的更多详细信息 我之前在http://manish-m.com/?p=996的非阻塞IO上记下了我的笔记。您还可以在http://manish-m.com/?p=915(特别是此页面上的IO Playground部分)查看相关帖子。

    NIO线程池用于处理多个连接请求。它使用内核的非阻塞IO功能,因此少量线程可以与许多连接一起使用。

    但是,从网络缓冲区读取数据的相同线程也会执行“用户代码”(我们在servlet中编写)。用于NIO的servlet容器的框架处理接受客户端请求,但是它不能自己处理由我们编写的“阻塞用户代码”。因此,如果我们编写一个占用10秒的DB Query,那么容器框架本身就不能异步处理它。我们将通过在servlet中编写任何阻塞代码来阻止原始的NIO线程池。因此,我们需要显式编写任何我们认为可能阻塞容器请求线程的东西,作为Java EE中的Async servlet。

    类似地,当我们使用其他NIO框架(如Netty,MINA)时,我们需要注意确保代码“不”阻止处理网络连接的NIO线程。这通常通过将这样长时间运行的任务卸载到另一个线程池(这是容器在编写异步servlet时所执行的操作)来实现。

答案 1 :(得分:0)

只有很多线程可用于服务HTTP请求。它们来自HTTP线程池,可通过您的应用程序服务器配置机制进行配置(例如,Glassfish的管理UI)。如果您的servlet执行长时间运行操作,则这些请求线程将被占用。一旦所有池化的请求线程被占用,在释放一个请求线程之前,将无法继续提供其他请求。

使用Async servlet,请求线程将返回到池,而不是在非异步情况下被长时间运行的同步操作阻止。