JAVA Web Servlet中的异步处理 (2) – Servlet3.1中的Non-blocking IO支持

在servlet 3.1中,新增了non-blocking IO支持。
在servlet 3.0中,引入了异步请求处理。在一个典型的程序中,使用ServletInputStream来循环读取。
但是如果输入的数据被阻塞或者流速很慢,则服务线程必须等待数据进来。ServletOutputStream也存在这样的问题。

示例:

public class TestServlet extends HttpServlet {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) {// do something }}
}

在servlet 3.1中,引入了JSR 340,添加non-blocking IO处理。
添加修改了几个新的接口和类,如IO的事件监听器 -ReadListener WriteListener.
修改了ServletInputStream、ServletOutputStream。
通过ServletInputStream.setReadListener和ServletOutputStream.setWriteListener可以注册监听器。监听器中提供了一些回调方法,在数据可以读写时进行触发调用。
新增加的ServletInputStream.isReady方法和ServletInputStream.isFinished方法用于检测非阻塞I/O的读取状态,而ServletOutputStream.canWrite方法用于检测数据是否能够无阻塞地写入。

改进后的doGet方法一般如下所示:

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

示例实现

@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);System.out.println("--> " + data);// do something}} catch (IOException ex) {// log it}
}@Override
public void onAllDataRead() {// do somethingcontext.complete();
}@Override
public void onError(Throwable t) {t.printStackTrace();context.complete();
}

上述实现有三处回调:
– onDataAvailable方法在数据可以无阻塞读取的时候进行调用。
– onAllDataRead方法在当前请求已经完全读取完毕的时候调用。
– onError方法在处理请求出错的时候调用。

JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持相关推荐

  1. JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持

    JAVA Web Servlet中的异步处理 (1) – Servlet3.0中的Async支持 每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会 ...

  2. 【暑假学习笔记】之——用Intellij idea新建一个java web+Servlet项目(有实例)——idea中快速重写父类的方法

    Intellij idea中快速重写父类方法 在写java文件时,有时候需要重写父类方法,但在idea中创建java文件时并不会像eclipse一样可以选择父类,但是重写父类方法其实只需要这样做: 鼠 ...

  3. Java Web Servlet

    Java Web Servlet Servlet是在服务器上运行的小程序.一个Servlet就是一个Java类,并且可以通过"请求-响应"编程模型来访问的这个驻留在服务器内存里的S ...

  4. java request获取域,Java Web - Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(二)...

    Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据.请求分派.请求域)(2) HttpServletRequest ----------------- ...

  5. 基于java web servlet生鲜商城管理系统源码含报告文档

    (一)目的 电子商务的迅速兴起,网上购物也为人们的生活提供了极大的便利,不受时间和空间的限制.商城系统的兴起,扩大了消费市场的空间,对于大型企业来说,建设商城系统是正确的选择,不仅要扩大销售渠道,而且 ...

  6. Java web—Servlet过滤器(Filter)

    前言:         过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器:因此这篇blog来单独总结下关于过滤器的知识点. 一.首先来了解一下什么是过滤器: 下面这句话引 ...

  7. Java web—Servlet的请求与响应

    前言:         在家上网课快上疯了╰(‵□′)╯,上课连课本都没有,太难受了呜呜呜~, 只能在blog里记录一下这段时间的学习的内容,太难了- 一.servlet概述: 运行在WEB服务器端的 ...

  8. java web servlet、servlet容器 HTTP服务器和mvc三层架构或者说servlet属于哪一层的,给我搞的晕晕的,今天终于弄明白了

    0 我们先看Web容器是什么? 首先,让我们简单回顾一下web技术的发展历史,可以帮助你理解web容器的由来. 早期的web应用主要用于浏览新闻等静态页面,HTTP服务器(比如Apache,Nginx ...

  9. java web——servlet+jsp实现前后台交互

    大学生涯终于结束,在公司学习了一段时间的java web方面的知识,结合自己之前的一些理解,想通过几篇文章来对我所接触到的java技术进行梳理与总结,也希望能给大家一些参考,由于作者水平有限,难免存在 ...

最新文章

  1. ionic中的ion-option-button
  2. OWASP Webgoat 安装和使用
  3. 天线巴伦制作和原理_一种基于LTCC技术的新型Marchand巴伦滤波器
  4. 如何为网页添加小宠物挂件:小老鼠、金鱼等
  5. c-free为什么要多输入一条_为什么微信语音不能转发?知道真相后才发现我们都错怪了微信!...
  6. 计算机管理术语路径描述的是,directory
  7. matlab火箭升空问题,困扰火箭的三大问题终于要解决了!球迷:我都要膨胀了!...
  8. 2015蓝桥杯省赛---java---C---6(奇妙的数字)
  9. 宝塔命令号操作全-最实用的莫过于修改密码啦
  10. java解析yml文件_如何基于JAVA读取yml配置文件指定key内容
  11. 黑马day16 jqueryamp;属性过滤选择器
  12. Node js npm 包管理工具的基本使用
  13. 微波网络插入反射系数与输入反射系数
  14. python合并表格_python合并表格sheets
  15. 【iOS】Web Color 的 Swift 实现
  16. 软件设计原则(四) 里氏替换原则
  17. [Mac OS] Homebrew简介及安装wine
  18. word公式常用快捷键
  19. c语言查看cpu温度代码_C语言获取CPU核心温度
  20. Adobe Photoshop(Ps)2023软件安装包下载及安装教程(mac+windows多版PS软件) 超级丰富的!

热门文章

  1. 用Python实现一个SVM分类器策略
  2. angular 在IIS部署运行
  3. 关于Webview如何自动登录保存登录信息
  4. Android Studio 2.3 Canary 3 版本发布
  5. 企业云桌面-03-安装第1个企业 CA-013-CA01
  6. 普通计算机网络和工业控制网络的区别,浅谈工控电脑和普通电脑的区别
  7. python 字符ab+字符c 2_python入门 之 字符串(二)
  8. antd table设置表格一个单元格的字体颜色_开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件
  9. 华为云计算玉溪总经理_华为云计算(6)——FusionAccess
  10. linux下pcre编译,linux下交叉编译lighttpd以及pcre