`
Kingson_Wu
  • 浏览: 120571 次
文章分类
社区版块
存档分类
最新评论

关于 tomcat nio connector, servlet 3.0 async, spring mvc async 的关系

 
阅读更多

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

    【标题】:“手写 Tomcat NIO” 在深入探讨手写Tomcat NIO之前,我们首先需要理解NIO(Non-blocking I/O)的概念。NIO是Java提供的一个用于替代传统I/O模型(即BIO,Blocking I/O)的库。在BIO中,每个连接都需要一...

    spring mvc中启动netty

    通常,Spring MVC使用Tomcat或其他Servlet容器来处理HTTP请求。但通过集成Netty,我们可以利用其非阻塞I/O的优势,提高应用性能。 3. **为什么要集成Netty** - **高性能**:Netty基于NIO,能更好地处理大量并发...

    Tomcat 8源代码 Servlet源代码

    3. **Servlet容器**:Tomcat实现Servlet 3.0规范,提供Servlet的加载、初始化、调度和服务功能。`StandardWrapper`类负责管理Servlet实例,而`StandardContext`管理Web应用的配置和Servlet的映射。 4. **Connector...

    《java学习》-Java web开发async机制学习.zip

    Spring MVC提供了对Servlet 3.0异步处理的封装,通过`@Async`注解标记在方法上,表示这个方法将在后台线程中执行。`@Async`方法所在的类需要配置为`@EnableAsync`的bean,这样Spring会自动创建一个TaskExecutor来...

    《IT学习资料》-Java web开发async机制学习.zip

    这通常包括对Servlet 3.0及以上版本的异步处理API的理解,Spring MVC中的异步支持以及Tomcat等服务器的异步IO实现。 首先,Servlet 3.0引入了异步处理能力,通过`HttpServletRequest.startAsync()`方法开启异步处理...

    看透springMvc源代码分析与实践

    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 ...

    tomcat源码,servlet-api源码

    《深入理解Tomcat源码与Servlet-API》 Tomcat,作为Apache软件基金会的顶级项目,是Java Servlet和JavaServer Pages(JSP)的开源Web应用服务器,被广泛应用于中小型企业的Web服务部署。7.0.59版本是Tomcat的一个...

    基于Spring MVC的web框架 1.1.11

    Excel工具类 Word工具类 Java NIO实现socket工具类 分布式session jdk升级到1.7 嵌入式redis服务(只支持linux) 1.0.13 修改默认的beanName生成策略,controller参数扩展 1.0.14 分布式session使用zookeeper 1.0.15 ...

    tomcat-7.0.5

    1. **Servlet 3.0特性**:Tomcat 7.0.5支持Servlet 3.0,带来了诸如异步处理能力的增强,允许在后台线程中执行耗时的操作,而不会阻塞主线程。这显著提高了Web应用的性能和响应性。此外,还支持注解配置,开发者可以...

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

    例如,Tomcat服务器在处理请求时就结合了Servlet API和NIO。当一个HTTP请求到达时,Tomcat会使用Servlet API解析请求,然后通过NIO模型将请求传递给后端业务逻辑。这样做可以充分利用NIO的非阻塞特性,提高服务器的...

    详解Servlet 3.0/3.1 中的异步处理

    xt.complete(); // 结束异步上下文 } catch (IllegalStateException e) { ...为了充分利用这些特性,你需要确保你的应用服务器支持Servlet 3.0或3.1规范,同时在编写Servlet时适配这些新特性,以实现高效的异步处理。

    jar包直接当做web服务,netty负责http协议,配合springMVC,再也不用tomcat了

    在没有Tomcat的情况下,Spring MVC仍然可以处理路由、请求处理和视图渲染,但是由于不支持JSP,我们需要寻找其他方式来呈现视图,例如使用Thymeleaf、Freemarker或者纯HTML静态文件。 4. **jar包部署**: 传统的Web...

    tomcat-servlet源码

    Tomcat中的`org.apache.catalina.connector.Request`和`org.apache.catalina.connector.Response`类是请求和响应处理的核心,它们负责将请求分发到对应的Servlet。Dispatcher使用`service()`方法来调用Servlet,...

    基于Spring Boot + NIO实现的电商平台见证宝服务

    本项目"基于Spring Boot + NIO实现的电商平台见证宝服务"旨在利用Spring Boot的便捷性与NIO(非阻塞I/O)的效率,来打造一个高效、稳定且可扩展的服务。下面将详细阐述其中涉及的关键技术点。 首先,Spring Boot是...

    Spring MVC upload/download file(注释和非注释实现)

    在`web.xml`中配置DispatcherServlet,并在Spring的配置文件(如`servlet-context.xml`)中启用注解驱动的Spring MVC: ```xml &lt;!-- 配置DispatcherServlet --&gt; &lt;servlet&gt; &lt;servlet-name&gt;dispatcher&lt;/servlet-name...

    服务器压缩包tomcat-7

    2. **JSP 2.2支持**:与Servlet 3.0同时,Tomcat 7也支持JSP 2.2,这意味着更强大的模板语言和增强的EL(Expression Language)表达式。开发者可以利用这些特性创建更加动态和交互式的Web页面。 3. **NIO(非阻塞I/...

    tomcat 7 和 tomcat 8

    Tomcat 7 和 Tomcat 8 是两个非常重要的版本,它们是Apache软件基金会开发的开源Java Servlet容器,主要用于运行Java Web应用程序。这两个版本都遵循Java EE(Enterprise Edition)规范,但各自具有不同的特点和改进...

    Servlet3.1规范(最终版)

    此版本的Servlet规范已经包含在Java EE 7平台中,而Servlet 3.0规范则被包含在Java EE 6平台中。此规范的参考资料包括多个RFC标准,它们提供了关于开发和实现Java Servlet API和标准servlet引擎的详细信息。 ### ...

    netty-spring-mvc-master.rar_netty_netty spring_netty4 spring_s

    《Netty与Spring MVC整合应用深度解析》 在现代的高性能网络编程中,Netty以其高效、灵活的特点,成为许多开发者首选的异步事件驱动网络应用框架。而在企业级应用开发中,Spring MVC则以其强大的MVC架构和依赖注入...

Global site tag (gtag.js) - Google Analytics