博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Java EE 7精粹》—— 2.5 非阻塞I/O
阅读量:6503 次
发布时间:2019-06-24

本文共 1125 字,大约阅读时间需要 3 分钟。

本节书摘来异步社区《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()方法是个新的方法,用于检查非阻塞数据是否可写。

转载地址:http://kyhyo.baihongyu.com/

你可能感兴趣的文章
spark集群安装部署
查看>>
MySql 查询表字段数
查看>>
mariadb 内存占用优化
查看>>
Centos7安装编译安装zabbix2.219及mariadb-5.5.46
查看>>
怎么获得combobox的valueField值
查看>>
Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
查看>>
浅谈网络协议(四) IP的由来--DHCP与PXE
查看>>
jre与jdk的区别
查看>>
全景图的种类
查看>>
git 维护
查看>>
jfinal框架下使用c3P0连接池连接sql server 2008
查看>>
Jfinal Generator 不需要生成带某个前缀的表名数组的方法
查看>>
struts2中使用标签操作静态方法等
查看>>
熬夜写了一个小游戏,向SpaceX聊表敬意
查看>>
身份证工具类
查看>>
JPA增删改查,
查看>>
apache 开启 gzip 压缩服务
查看>>
python mysql
查看>>
开源 免费 java CMS - FreeCMS1.5-建站向导
查看>>
Selenium的延迟等待
查看>>