我想知道,如果像 Tomcat、Jetty 等 servlet 容器已经使用 nio 来读取和写回数据,是否真的需要使用 setWritelistner
和 setReadListner
servlet 输入和输出流?是否有任何额外的性能提升?
最佳答案
Tomcat 读取 header (并且以 NIO 的非阻塞模式执行) 但是读取请求体是一个应用程序关注点并且被执行 具有阻塞 IO(直到规范的 Servlet 3.0 要求)。同样地, 编写响应是通过阻塞 IO 完成的,因为这也是一个 规范要求。
所有这些都随着 Servlet 3.1 发生了变化。
你可能想看看 email Thread为此
下面的段落和代码示例来自 Java EE 7 Recipies,它解释了 setWritelistner 和 setReadListner 的使用
To implement a nonblocking I/O solution, new programming interfaces have been added to ServletInputStream and ServletOutputStream, as well as two event listeners: ReadListener and WriteListener. ReadListener and WriteListener interfaces make the servlet I/O processing occur in a nonblocking manner via callback methods that are invoked when servlet content can be read or written without blocking. Use the ServletInputStream.setReadList ener(ServletInputStream, AsyncContext) method to register a ReadListener with a ServletInputStream, and use the I/O read ServletInputStream.setWriteListener(ServletOutputStream,AsyncContext) method for registering a WriteListener. The following lines of code demonstrate how to register a ReadListener implementation with a ServletInputStream:
AsyncContext context = request.startAsync();
ServletInputStream input = request.getInputStream();
input.setReadListener(new ReadListenerImpl(input, context));
关于java - 使用 servlet 3.1 异步 io 有什么真正的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060856/