Tomcat 7 Connector 精读(2) CoyoteAdapter

这个适配器类只讲2个方法,构造方法中我们看到一个适配器对象有自己关联的连接器类。

其中Service的重要任务就是讲客户端端请求交给容器。

public void service(org.apache.coyote.Request req,
                        org.apache.coyote.Response res)
        throws Exception {

        Request request = (Request) req.getNote(ADAPTER_NOTES);
        Response response = (Response) res.getNote(ADAPTER_NOTES);

        if (request == null) {

            // Create objects
            request = connector.createRequest();
            request.setCoyoteRequest(req);
            response = connector.createResponse();
            response.setCoyoteResponse(res);

            // Link objects
            request.setResponse(response);
            response.setRequest(request);

            // Set as notes
            req.setNote(ADAPTER_NOTES, request);
            res.setNote(ADAPTER_NOTES, response);

            // Set query string encoding
            req.getParameters().setQueryStringEncoding
                (connector.getURIEncoding());

        }

                connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
//最终的方法,获得连接器-->服务--》容器-》管道---》第一个value
               
                }

            }
            AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext();
            if (asyncConImpl != null) {
                async = true;
                ReadListener readListener = req.getReadListener();
                if (readListener != null && request.isFinished()) {
                    // Possible the all data may have been read during service()
                    // method so this needs to be checked here
                    ClassLoader oldCL =
                            Thread.currentThread().getContextClassLoader();
                    ClassLoader newCL =
                            request.getContext().getLoader().getClassLoader();
                    try {
                        Thread.currentThread().setContextClassLoader(newCL);
                        if (req.sendAllDataReadEvent()) {
                            req.getReadListener().onAllDataRead();
                        }
                    } finally {
                        Thread.currentThread().setContextClassLoader(oldCL);
                    }
                }
            } else if (!comet) {
                request.finishRequest();
                response.finishResponse();
                if (postParseSuccess &&
                        request.getMappingData().context != null) {
                    // Log only if processing was invoked.
                    // If postParseRequest() failed, it has already logged it.
                    // If context is null this was the start of a comet request
                    // that failed and has already been logged.
                    request.getMappingData().context.logAccess(
                            request, response,
                            System.currentTimeMillis() - req.getStartTime(),
                            false);
                }
            }

        } catch (IOException e) {
            // Ignore
        } finally {
            req.getRequestProcessor().setWorkerThreadName(null);
            AtomicBoolean error = new AtomicBoolean(false);
            res.action(ActionCode.IS_ERROR, error);
            // Recycle the wrapper request and response
            if (!comet && !async || error.get()) {
                request.recycle();
                response.recycle();
            } else {
                // Clear converters so that the minimum amount of memory
                // is used by this processor
                request.clearEncoders();
                response.clearEncoders();
            }
        }

    }
时间: 2024-10-14 05:33:57

Tomcat 7 Connector 精读(2) CoyoteAdapter的相关文章

Tomcat 7 Connector 精读(1)

这个类图是本人截取的最重要的类的方法和属性. 其中ProtocalHandler是协议处理器,tomcat支持的协议以下方法可以看到.不同协议实现了不同的ProtocalHandler类. public void setProtocol(String protocol) { if (AprLifecycleListener.isAprAvailable()) { if ("HTTP/1.1".equals(protocol)) { setProtocolHandlerClassName

Tomcat 7 Connector 精读(2) 协议处理器 Http11Protocol(待续)

. Http11Protocol是阻塞式IO的实现,上图的几个方法是它的生命周期相关的方法.

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

tomcat 的 org.apache.coyote.http11.Http11NioProtocol Connector 是一个使用 Java NIO 实现的异步 accept 请求的 connector 它的作用是不需要为每个请求建立一个线程, 而是使用固定的accept线程 accept 多个请求, 然后排队处理. 大概的意思是使用固定的 acceptThread 来 accept n 个请求, 然后将请求入队, 最后使用固定的 requestProcessingThread 来处理业务逻

内嵌Tomcat的Connector对象的静态代码块

在排查问题的过程中发现Connector对象有一个静态代码块: static { replacements.put("acceptCount", "backlog"); replacements.put("connectionLinger", "soLinger"); replacements.put("connectionTimeout", "soTimeout"); replacem

[转]Loadrunner Error code 10053 & Tomcat 连接器(connector)优化

LoadRunner提示错误:Error : socket0 - Software caused connection abort. Error code : 10053. 在今天的测试过程中发现,socket请求连接时总是出错,code是10053,google后把问题已经解决了.关键的点就在于Web服务器(Tomcat/Jboss)的一个参数的配置. "MaxKeepAliveRequests" MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数

Tomcat中connector配置说明

<Connector port="8080 Protocol="org.apache.coyote.http11.Http11NioProtocol"   Executor="tomcatThreadPool"连接器使用线程池的名字   compression="on"          压缩 compressionMinSize="2048" 最小压缩比   maxThreads="30000&qu

How Tomcat Works - Connector

在前两章实现的WebServer还有很多问题,比如: 1)最后一个out.print("xxx")没有生效. 2)没有解析请求头,请求方法,协议,uri等,而这些内容在servlet里面是可能要用到的. 在这一章中,增加了一个新的servlet:ModerServlet: import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.S

Tomcat源码分析

前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, 是不那么容易掌握TOMCAT的框架的. 所以得实践.实践.再实践. 建议下载一份TOMCAT的源码, 调试通过, 然后单步跟踪其启动过程. 如果有不明白的地方, 再来查阅本文, 看是否能得到帮助. 我相信这样效果以及学习速度都会好很多! 1. Tomcat的整体框架结构 Tomcat的基本框架,

tomcat 解析(二)-消息处理过程

接下来我们应该去了解一下 tomcat 是如何处理jsp和servlet请求的. 1.  我们以一个具体的例子,来跟踪TOMCAT, 看看它是如何把Request一层一层地递交给下一个容器, 并最后交给Wrapper来处理的. 以http://localhost:8080/web/login.jsp为例子 (以下例子, 都是以tomcat4 源码为参考) 这篇心得主要分为3个部分: 前期, 中期, 和末期. 前期:讲解了在浏览器里面输入一个URL,是怎么被tomcat抓住的. 中期:讲解了被to