zoukankan      html  css  js  c++  java
  • 关于 tomcat nio connector, servlet 3.0 async, spring mvc async 的关系

    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, 而不能放到别的线程处理

  • 相关阅读:
    在chrome中利用“油猴”为每个网页增加“返回顶部”功能
    EasyVS 0.3版本发布 给力变换vs编辑器主题
    python使用matplotlib绘图 barChart
    Automatic IE Testing With Python
    上网计时小助手
    关于在未安装frontpage 服务扩展的情况下创建web应用程序的问题
    申请加入了sharepoint团队
    Linq学习之旅——LINQ查询表达式
    使用 ASP.NET 创建的 XML Web 服务的概述
    用C#获取硬盘序列号,CPU序列号,网卡MAC地址
  • 原文地址:https://www.cnblogs.com/zemliu/p/3975983.html
Copyright © 2011-2022 走看看