码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-09-16 23:38:31      阅读:374      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   java   ar   div   

tomcat 的 org.apache.coyote.http11.Http11NioProtocol Connector 是一个使用 Java NIO 实现的异步 accept 请求的 connector

它的作用是不需要为每个请求建立一个线程, 而是使用固定的accept线程 accept 多个请求, 然后排队处理.

大概的意思是使用固定的 acceptThread 来 accept n 个请求, 然后将请求入队, 最后使用固定的 requestProcessingThread 来处理业务逻辑, 业务逻辑的处理实际上也是同步的

Http11NioProtocol 从 tomcat 6.x 开始支持

 

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 connector, servlet 3.0 async, spring mvc async 的关系

标签:style   blog   http   color   io   使用   java   ar   div   

原文地址:http://www.cnblogs.com/zemliu/p/3975983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!