http://www.cnblogs.com/zemliu/p/3975983.html
tomcat 的org.apache.coyote.http11.Http11NioProtocol Connector 是一个使用 Java NIO 实现的异步 accept 请求的 connector
它的作用是不需要为每个请求建立一个线程, 而是使用固定的accept线程 accept 多个请求, 然后排队处理.
大概的意思是使用固定的 acceptThread (网络 IO 线程, 负责 accept, read, write) 来异步处理(nio accept, read, write) n 个请求, 然后将请求入队, 最后使用固定的 requestProcessingThread (业务线程) 来处理业务逻辑, 业务逻辑的处理实际上也是同步的
Http11NioProtocol 从 tomcat 6.x 开始支持, 其中文档中提到 read request body 以及 write response body 是 sim-blocking (simulated blocking), 也就是说在 read request body 以及 wirte response body 的时候, 不会在读到部分请求内容, 或者只写除了部分相应内容时候就给用户返回结果(例如只有收到完整的request才会触发 servlet 的 get() 或者 post()
方法), 但是实际上这个同步 api 的底层使用 nio 的异步 api 实现的, 所以叫做 simulated blocking. 同时, 它实际上还是异步的网络io读写, 所以它实际上是单个线程同时处理多个网络 io 请求的
servlet 3.0 从 tomcat 7.x 开始支持, 它使得业务处理也可以异步, Spring 3.2 的 async 变成也是基于 servlet 3.0 来做的, 例如
@ResponseBody
@RequestMapping("/{surl}")
public DeferredResult<ResponseEntity<String>> redirect(@PathVariable String surl) {
final DeferredResult<ResponseEntity<String>> dr = new DeferredResult<ResponseEntity<String>>(TIMEOUT_MS, ResponseEntityResult.TIMEOUT);
// ... 异步的做一些事情, 最后将结果 set 到 DeferredResult
new Thread(new AsyncTask(dr)).start();
return dr;
}
private static class AsyncTask implements Runnable {
private DeferredResult result;
private AsyncTask(DeferredResult result) {
this.result = result;
}
@Override
public void run() {
// 业务逻辑
// ...
// 设置结果
result.setResult(result);
}
}
这样 tomcat 的 requestProcessingThread 可以解脱出去处理别的请求, 而且 servlet-2.5 你只能把最后结果处理出来, 最后 return, 而不能放到别的线程处理
分享到:
相关推荐
手写 tomcat nio http://knight-black-bob.iteye.com/blog/2408450
8.2.2 创建Spring MVC的xml配置文件85 8.2.3 创建Controller和view86 8.3 关联spring源代码87 8.4 小结89 第9章 创建Spring MVC之器90 9.1 整体结构介绍90 9.2 HttpServletBean93 9.3 FrameworkServlet95 ...
Excel工具类 Word工具类 Java NIO实现socket工具类 分布式session jdk升级到1.7 嵌入式redis服务(只支持linux) 1.0.13 修改默认的beanName生成策略,controller参数扩展 1.0.14 分布式session使用zookeeper 1.0.15 ...
3-5Tomcat响应请求源码与nio处理请求源码实现.mp4
tomcat默认的 HTTP connector 是阻塞的,并且每个连接对应一个线程。这会造成线程资源的浪费,因为连接本身可能不一定频繁被使用,而是仅仅被用来k
基于Spring Boot + NIO实现的电商平台见证宝服务
此文档是Java Servlet规范,版本:3.1。此文档描述了Java Servlet API标准。
JAVA核心知识点整理,涵盖JAVA基础、集合类、JVM、IO/NIO、多线程、Spring原理等知识。
此版本在Tomcat7.0.69 的基础上进行了部分配置信息的优化, 1、关闭了几乎不再使用的 ajp 协议配置(server.xml), 2、 启用nio 和 线程池配置 (server.xml) 3、修改了context.xml ,添加redis 支持(注意redis ...
tomcat8.5.56_windows_X64_个人优化版+垃圾回收机制+乱码问题处理,可以直接部署,也可供参考学习
Connector 和 Container 之间存在微妙的关系,Connector 负责处理请求和响应,而 Container 负责处理 servlet 的容器。Connector 会将请求传递给 Container,Container 会执行 servlet,并将响应传递回 Connector。
如果细究会发现Tomcat有两个NIO Connector,一个是Http11NioProtocol,另一个是Http11Nio2Protocol。 如果配置Connector不指定class name,而是指定协议。那么如果没有配置APR,Tomcat会使用Http11NioProtocol。 为...
说明下关于TOMCAT调优一种建议 1 Connector介绍 1.1 Connector的种类 Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类: Http Connector, 基于HTTP协议,负责建立HTTP连接...
Async是基于nio4r和定时器的Ruby的可组合的异步I/O框架
NULL 博文链接:https://conkeyn.iteye.com/blog/523234
目标环境Tomcat + JDK 使用 NIO/BIO 连接器进行 SSL。 在 Tomcat 7 + Java 7 / Tomcat 8 + Java 8 上测试,但写成 Tomcat 4.1 + JDK1.4.2 兼容。注意密码列表按推荐顺序排序。 接下来 Tomcat 将支持 Tomcat 8.0.21 /...
NULL 博文链接:https://suhuanzheng7784877.iteye.com/blog/1122131
的Apache Tomcat 7.x的建立在Tomcat中6.0.x的改进和实现的Servlet 3.0, JSP 2.2,EL 2.2和 WebSocket的1.1规格。除此之外,它还包括以下改进: Web应用程序内存泄漏检测和预防 提高了Manager和Host Manager应用...
版本:apache-tomcat-8.5.100 以下是一些 Tomcat 8 中新增的主要功能: 1. Servlet 3.1规范支持:Tomcat 8 支持最新的Servlet 3.1...7. NIO2支持:Tomcat 8 使用了Java 7中引入的NIO2 API,提供了更好的异步I/O支持。
从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式.doc