java - 使用 servlet 3.1 异步 io 有什么真正的好处?

标签 java performance tomcat servlets nio

我想知道,如果像 Tomcat、Jetty 等 servlet 容器已经使用 nio 来读取和写回数据,是否真的需要使用 setWritelistnersetReadListner 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/

相关文章:

java - 从 Eclipse 运行 Maven 应用程序的所有 Servlet 上的 ClassNotFoundException

java - 在 Java 或 php 中拆分 .flv 文件

java - BlueJ - 我的程序编译没有错误但没有运行

java - json.org 零被保存为字符串而不是数字

java - 从 Assets 文件夹中删除数据库文件

PHP PDO 连接效率

java - 有没有可能看到 *.war 文件执行的日志?

php - IN() 在 DB 中快速选择 php 中的慢速。重写加入更慢

performance - 停止应用程序的所有内存访问

tomcat - 在tomcat上配置虚拟主机