2016-10-01 90 views
5

到目前为止,因为它适用于服务http请求,所以我认为术语 - asynchronousnon-blocking i/o意味着同样的事情。但显然,它们分别在servlet 3.0和3.1中分别实现。我正在努力了解这里的区别...Java - Servlet 3.0中的异步与Servlet 3.1中的NIO

请问有人可以在这个主题上多说一点吗?具体来说,我正在寻找一个例子,说明一个服务器的servlet 3.0实现如何可以是异步的,但阻塞在一个线程上?我想如果我明白这一点,可能会更容易理解servlet 3.1中的非阻塞I/O试图解决的确切问题。

回答

4

我会尽量总结我所学到的东西。据了解,Servlet的3.0和Servlet 3.1解决这个问题,让我们来看看这样说:

此前Servlet的3.0:
长期运行的线程导致线程匮乏。在Servlet 3.0之前,针对这些长时间运行的线程有特定于容器的解决方案,我们可以产生一个单独的工作线程来执行繁重的任务,然后将响应返回给客户端。在启动工作线程后,servlet线程返回到servlet池。 Tomcat的Comet,WebLogic的FutureResponseServlet和WebSphere的Asynchronous Request Dispatcher是实现异步处理的一些例子。
(更多信息请参见link 1

的Servlet 3.0异步:
实际工作可以委托给一个线程池实现(独立容器特定的解决方案)。 Runnable实现将执行实际处理,并将使用AsyncContext将请求分派到另一个资源或写入响应。我们还可以将AsyncListener实现添加到AsyncContext对象以实现回调方法。
(更多信息参见link 1。)

的Servlet 3.1 NIO:
的Servlet 3.0允许异步请求处理,但只有传统的I/O被允许。传统I/O如何影响处理?那么,如果进入服务器(I/O)的数据阻塞或流传输速度慢于服务器可读,则服务器线程必须等待该数据。另一方面,如果数据写入ServletOutputStream的速度较慢,则客户端线程必须等待。此问题通过ReadListenerWriteListener接口解决。这些注册在ServletInputStreamServletOutputStream。监听器具有回调方法,当内容可用于读取或者可以在没有阻塞的情况下被写入时,这些回调方法被调用。
(更多信息请参见link 2

现金 http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3
https://blogs.oracle.com/arungupta/entry/non_blocking_i_o_using