异步Servlet有什么好处

尼克·迪夫(Nick Div)

我正在阅读异步Servlet 3.1

据说当有很多耗时的操作要执行时,例如从数据库中获取较长的数据列表,发送请求的线程就被释放了。

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

因此,异步servlet比我们之前拥有的每个请求模型线程更多的好处。

曼尼斯·马什瓦里

在这里分为两个部分:

  1. 异步servlet比我们先前拥有的每个请求模型的线程有何好处?这种模式已经死了,几乎所有的Java服务器都使用NIO,这使得这些服务器可以使用少数几个线程处理数百个连接。您可能也为您的应用服务器验证了这一点,您会惊讶地发现它确实使用了NIO :)。异步Servlet与每个线程的一个请求没有任何关系。
  2. 那么,为什么异步Servlet的:嗯,异步的Servlet允许原始请求完成的,无需等待异步任务完成(这是希望长期运行)。因此,远程客户端可以立即得到响应,并且他们可以根据需要执行其他操作。服务器稍后可以在线程之一中处理异步任务。这些异步操作通常在单独的线程池中完成,用于异步操作。用于处理客户端连接的线程池用于异步操作。

更新:如果我们已经在使用NIO线程池,那么为什么需要异步Servlet的更多详细信息,我前一段时间在http://manish-m.com/?p=996上的非阻塞IO上记下了我的笔记您也可以在http://manish-m.com/?p=915(尤其是此页面上的IO Playground部分)上查看相关文章

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章