《Java EE 7精粹》—— 2.5 非阻塞I/O

简介: 在这段代码中,onDataAvailable()回调方法被调用时数据可以不受阻塞地读取。ServletInputStream.isReady()方法用于检查数据可以被读取而不会阻塞,然后将数据读出。context.complete()方法在onAllDataRead()方法和onError()方法中被调用,以发出完成读取数据的信号。

本节书摘来异步社区《Java EE 7精粹》一书中的第2章,第2.5节,作者:【美】Arun Gupta,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.5 非阻塞I/O

Servlet 3.0允许异步请求处理,但只允许传统的I/O,这限制了应用程序的可扩展性。在典型应用中,在while循环中读取ServletInputStream:

f49437a059f8f35df9246be9c3b8c96e1565f3a7

如果传入的数据被阻塞或者数据流慢于服务器的读取,那么服务器线程就要等待数据。如果数据被写入到ServletOutputStream,同样也可能发生这样的等待。这限制了Web容器的可扩展性。

非阻塞I/O允许开发人员在有可读的数据时执行读操作或者在有写入的数据时执行写操作。这不仅增加了Web容器可伸缩性,也增加了可以同时处理的连接数量。非阻塞I/O只能用于异步请求处理的Servlet、Servlet过滤器和升级处理。

Servlet 3.1通过引入两个新的接口实现了非阻塞I/O:ReadListener和WriteListener。这些接口定义了回调方法,用于在有可读或者可写内容时被调用而不阻塞线程。

在本例中doGet()方法需要重写:

8986938ec369df7ea7fe5f8175fc879e5dad1217

调用setXXXListener方法表明使用非阻塞I/O来代替传统的I/O。

ReadListener有以下三个回调方法。

  • 每当非阻塞的可读数据有效时,onDataAvailable()回调方法被调用。
  • 每当当前请求的数据读取完全时,onAllDataRead()回调方法被调用。
  • 如果请求处理过程中发生错误,onError()回调方法被调用:

4a1415bcc7b425e6e2e13a0410d59ce070ff9922

在这段代码中,onDataAvailable()回调方法被调用时数据可以不受阻塞地读取。ServletInputStream.isReady()方法用于检查数据可以被读取而不会阻塞,然后将数据读出。context.complete()方法在onAllDataRead()方法和onError()方法中被调用,以发出完成读取数据的信号。ServletInputStream.isFinished()方法可被用于检查非阻塞I/O读取的状态。

在ServletIntputStream中最多可以注册一个ReadListener。

WriteListener有以下两个回调方法。

  • 每当非阻塞的可写数据有效时,onWritePossible()回调方法被调用。
  • 如果请求处理过程中发生错误,onError()回调方法被调用。

在ServletOutputStream中最多可以注册一个WriteListener。ServletOutputStream. canWrite()方法是个新的方法,用于检查非阻塞数据是否可写。

相关文章
|
5月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java输入输出:什么是NIO(New I/O)?
34 1
|
5月前
|
Java API
Java基础知识:什么是Java平台,包括Java SE,Java EE和Java ME?
Java基础知识:什么是Java平台,包括Java SE,Java EE和Java ME?
55 2
|
3天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
3天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
3天前
|
安全 Java 编译器
【Java EE】总结12种锁策略以及synchronized的实现原理
【Java EE】总结12种锁策略以及synchronized的实现原理
|
4天前
|
Java 调度 Windows
【Java EE】多线程(一)
【Java EE】多线程(一)
|
8天前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
8天前
|
消息中间件 存储 Java
Java从入门到精通:3.1.1掌握EJB、JPA、JMS等Java EE核心技术
Java从入门到精通:3.1.1掌握EJB、JPA、JMS等Java EE核心技术
|
15天前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
25 0
|
2月前
|
分布式计算 安全 Java
Java的三大体系架构:深入剖析Java的三大体系架构,包括Java SE、Java ME和Java EE等
Java的三大体系架构:深入剖析Java的三大体系架构,包括Java SE、Java ME和Java EE等
47 1