`
cucaracha
  • 浏览: 141501 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A8f3fa2f-18ce-3862-897a-5d2209197c90
Java NIO.2
浏览量:87953
7a076ba7-8ec8-3241-aa3c-67bb2f7856a2
Java EE 7 简明教...
浏览量:36730
社区版块
存档分类
最新评论

[Java EE 7] Servlet 非阻塞 I/O

阅读更多
Servlet 3.0 虽然支持异步请求处理,但却只允许使用传统 I/O,这会限制应用程序的可扩展性。在普通的应用程序中,ServletInputStream 是在 while 循环中进行读取:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
  ServletInputStream input = request.getInputStream();
  byte[] b = new byte[1024];
  int len = -1;
  while ((len = input.read(b)) != -1) {
    //. . .
  }
}


如果读取数据阻塞或者读取数据的速度很慢,那么服务器的线程将会一直等待读取数据。这种情况在通过 ServletOutputStream 写出数据的时候也会遇到。这将会限制 Web 容器的可扩展性。

非阻塞 I/O(Nonblocking I/O)允许开发者只在数据准备好的时候再进行读写操作。此功能不仅增加了服务器的扩展性还增加了服务器可处理的连接数。非阻塞 I/O 只允许在异步 Servlet、异步 Filter 和上传处理的时候使用。

Servlet 3.1 加入了非阻塞 I/O 并且引入了两个新的接口 ReadListener 和 WriteListener。这些接口有回调方法,当数据准备好的时候会被调用。 例如,在 Servlet 的 doGet 方法中可以编写下面的代码:

AsyncContext context = request.startAsync();
ServletInputStream input = request.getInputStream();
input.setReadListener(new MyReadListener(input, context));

调用 setXXXListener 方法将会使用非阻塞 I/O 取代传统 I/O。 ReadListener 有三个回调方法:

  •     onDataAvailable - 在数据没有阻塞,已经完全准备好可以读取的时候调用。
  •     onAllDataRead - 所有数据读取完成后调用。
  •     onError - 请求中发生错误的时候调用。


@Override
public void onDataAvailable() {
  try {
    StringBuilder sb = new StringBuilder();
    int len = -1;
    byte b[] = new byte[1024];
    while (input.isReady() && (len = input.read(b)) != -1) {
      String data = new String(b, 0, len);
    }
  } catch (IOException ex) {
    //. . .  
  }
}

@Override
public void onAllDataRead() {
  context.complete();
}

@Override
public void onError(Throwable t) {
  t.printStackTrace();
  context.complete();
}


在上面的代码中 onDataAvailable 将会在数据没有阻塞的时候调用。ServletInputStream.isReady 方法用来检查数据是否已经准备好可被无阻塞读取。context.complete 方法在 onAllDataRead 和 onError 方法中调用,用来通知 servlet 上下文环境数据读取操作已经完成。ServletInputStream.isFinished 方法可以用于检查非阻塞读取的状态。

只允许一个 ReadListener 注册到 ServletIntputStream 中。

WriteListener 有两个回调方法:

  •     onWritePossible - 当数据准备好进行无阻塞写出的时候调用。
  •     onError - 当操作出错的时候调用。


只允许一个 WriteListener 注册到 ServletOutputStream 中。ServletOutputStream.canWrite 方法可用于检测数据是否已经准备好进行无阻塞写出。

文章来源:http://www.aptusource.org/2014/04/java-ee-7-servlet-nonblocking-io/
0
0
分享到:
评论

相关推荐

    Java EE 7 Essentials英文版

    4. 非阻塞I/O操作的引入,这是通过Servlet 3.1规范中的新API实现的。非阻塞I/O可以让服务器在等待I/O操作完成时,转而处理其他任务。 5. Web Fragments的加入,允许开发人员将Web应用的不同部分封装在单独的模块中...

    Java.EE.7.Essentials

    1. Servlets:作为Java EE中的标准Web组件技术,Servlet 3.1规范(WebServlet)通过注解简化了Web应用的配置,并引入了异步处理和非阻塞I/O来提升Web应用的性能。 2. JavaServer Faces(JSF):这是一种用于构建...

    Java EE 7 API Documentation 官方英文版(html)

    Java EE 7中,Servlet 3.1规范引入了异步Servlet,允许开发者在处理请求时进行非阻塞I/O操作,提高了应用程序的性能。 2. **JSP (JavaServer Pages)**:JSP是一种动态网页技术,允许在HTML页面中嵌入Java代码。JSP ...

    Java EE 7 tutorial 中的examples代码

    1. **Servlet 3.1**:Java EE 7中Servlet规范升级到3.1版,引入了异步处理能力,允许Servlet在不阻塞请求的情况下执行长时间运行的任务。同时,Servlet 3.1还支持WebSocket协议,为实时通信提供了可能。 2. **JSP ...

    Java EE 7白皮书 中文(yr译v0.9)

    10. **Servlet 3.1**:Servlet规范的更新带来了对HTTP/2的支持,非阻塞I/O,以及改进的异步处理能力。 总的来说,Java EE 7通过这些增强和新特性,为开发者提供了更为强大和现代化的工具集,使得开发企业级应用更加...

    Java核心技术卷I和II(第八版)

    5. **输入/输出与NIO**:讲解Java的I/O流体系,包括字节流、字符流、对象序列化,以及非阻塞I/O(New I/O,NIO)框架的使用。 6. **多线程编程**:介绍线程的创建、同步、协作,以及线程池的使用。 7. **反射与...

    Servlet API 和 NIO: 最终组合在一起

    Servlet API是Java服务器端编程的重要组成部分,主要用于构建动态Web应用程序,而NIO则是一种非阻塞的I/O模型,提供了一种高效处理大量并发连接的方法。 Servlet API是Java EE的一部分,它定义了一系列接口和类,如...

    servlet3.1规范英文版

    - **非阻塞 I/O 支持**:Servlet 3.1 引入了非阻塞 I/O 模型,使得 Servlet 可以更高效地处理大量的并发连接。 - **异步处理**:通过支持异步处理,开发者可以在请求处理过程中执行耗时操作(如数据库查询或远程服务...

    Servlet3.1规范(英文).pdf

    为了提高性能,Servlet 3.1 提供了非阻塞 I/O 操作的支持。通过使用 `AsyncContext` 的 `readBody()` 和 `writeTo()` 方法,可以在不阻塞主线程的情况下处理输入和输出流,从而提高服务器的并发处理能力。 #### 三...

    javax.servlet-api-4.0.1.jar

    2. 阻塞I/O和非阻塞I/O:支持非阻塞I/O模型,如ServerWebSocket,以适应高并发场景。 3. AsyncContext:改进异步处理能力,允许Servlet在不阻塞线程的情况下处理请求。 4. 增强的文件上传:提供更便捷的文件上传处理...

    西安野马计算机培训学校JAVA EE讲义

    3. **JAVA IO与NIO**:介绍输入输出流的使用,以及非阻塞I/O模型(New I/O,NIO)的应用,这对于处理大量数据传输和高性能服务器编程至关重要。 4. **网络编程**:讲解Socket编程,理解TCP/IP协议,以及如何创建...

    Java核心技术 I II 全集 最新版

    4. **I/O与NIO**:介绍了传统的Java I/O系统和非阻塞I/O(New I/O,NIO)的使用,提高程序的效率。 5. **反射与注解**:讨论了如何在运行时获取类的信息,以及注解的定义、使用和元注解,增强了代码的动态性和元...

    Java网络程序设计 (PDF)

    三、Java NIO(非阻塞I/O) Java NIO(New I/O)是Java 1.4引入的一个新特性,它提供了更高效的数据传输方式。NIO使用Channel和Buffer进行数据读写,可以实现多路复用,提高服务器的并发性能。Selector类用于监控多...

    JAVA中文版帮助文档

    9. **NIO(非阻塞I/O)**:Java的NIO API(java.nio包)提供了异步I/O操作,相比传统的阻塞I/O,更适合高并发的网络应用。 10. **Java注解(Annotation)**:注解是一种元数据,可以在代码中添加信息,供编译器、...

    Servlet3.1规范说明中文版_英文版.rar

    2. **非阻塞I/O (NIO)**:Servlet 3.1支持非阻塞I/O,利用Java的`java.nio`包,可以更高效地处理大量并发连接,特别适合于高并发的网络应用。这使得Servlet能够处理更多的连接,而无需创建大量的线程,降低了内存...

    Java核心技术:卷Ⅱ高级特性(原书第8版)高清中文

    2. **网络编程**:Java的Socket类和ServerSocket类是进行网络通信的基础,而NIO(非阻塞I/O)则为高性能网络应用提供了可能。读者将学习到如何创建客户端和服务端应用,以及如何利用异步I/O提高网络效率。 3. **I/O...

    Java_EE_6.0_API_DOC

    7. **统一的异步编程模型**:Java EE 6.0引入了Asynchronous Servlet API,使得Web应用程序可以处理非阻塞I/O,提高了服务器性能。 8. **RESTful Web Services**:通过JAX-RS(Java API for RESTful Web Services)...

Global site tag (gtag.js) - Google Analytics