传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点

 传说用户发来的请求是在JIoEndpoint的accept函数中接收的,
 这是tomact与外界交互的分界点,所以来研究一下,
 》》》》》》》》》》》》》》》JIoEndpoint》》》》》》》》》》》》》》》》》》》 
  
 从最顶层的interface开启:
  
 ==================JIoEndpoint 怎么被拉起================
 
 public interface ProtocolHandler
        ---》public abstract class AbstractProtocol<S> implements ProtocolHandler,MBeanRegistration
                 ---》public abstract class AbstractAjpProtocol<S> extends AbstractProtocol<S> {
                        ---》public class AjpProtocol extends AbstractAjpProtocol<Socket> 
                        
                              java.org.apache.coyote.ajp.AjpProtocol.AjpProtocol()
                              
                                public AjpProtocol() {
                                    endpoint = new JIoEndpoint();
                                    cHandler = new AjpConnectionHandler(this);
                                    ((JIoEndpoint) endpoint).setHandler(cHandler);
                                    setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
                                    setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
                                    setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
                                }


 
 public class JIoEndpoint extends AbstractEndpoint<Socket>
 JIoEndpoint
 
 ==================JIoEndpoint 怎么被拉起================

 
 ================JIoEndpoint 处理请求==================
 
 endpoint = new JIoEndpoint();
 
 ((JIoEndpoint) endpoint).setHandler(cHandler);
 -----》 public void setHandler(Handler handler ) { this.handler = handler; }
  ------》cHandler = new AjpConnectionHandler(this);
  
  this --》AjpProtocol--》AbstractAjpProtocol--》AbstractProtocol
        ----------》void java.org.apache.coyote.AbstractProtocol.init() throws Exception
             ---》endpoint.init();
                  -------》AbstractEndpoint.init()
                        ---》bind();   
                                ---》public abstract void bind() throws Exception;
                                
                ----》JIoEndpoint.bind()                
 
                    
    serverSocket = serverSocketFactory.createSocket(getPort(), getBacklog());
    
     ???是谁调用的?startInternal()
      ----->startAcceptorThreads();
           ---> AbstractEndpoint.startAcceptorThreads()
            acceptors[i] = createAcceptor();
            t.start();
            
            --->JIoEndpoint
            protected AbstractEndpoint.Acceptor createAcceptor() {
                 return new Acceptor();
            }
                ----------->  java.org.apache.tomcat.util.net.AbstractEndpoint.Acceptor
                
                ---->run()
                        ---> JIoEndpoint.processSocket(Socket socket)
                             -->  getExecutor().execute(new SocketProcessor(wrapper));
                                
                                  --->SocketProcessor
                                      ---->run()
                                           --> state = handler.process(socket, SocketStatus.OPEN_READ);
                                           
                                           handler====Http11Protocol
                                      
                                    之后又会是谁去处理呢?
  结论是  JIoEndpoint在调用 Http11ConnectionHandler 的process方法进行处理。        
  看网上有人给的,我是没有想通,只是猜的,最后的解释在最后面给出。  
                                            Http11Processor

                                            {                              
                                                Http11Protocol()
                                                
                                                public Http11Protocol() {
                                                    endpoint = new JIoEndpoint();
                                                    cHandler = new Http11ConnectionHandler(this);
                                                    ((JIoEndpoint) endpoint).setHandler(cHandler);
                                                    setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
                                                    setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
                                                    setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
                                                }
                                                        ----------------》Http11ConnectionHandler
                                                                 ---------------》protected static class Http11ConnectionHandler
                                                              extends AbstractConnectionHandler<Socket, Http11Processor> implements Handler {
                                            }
            Http11Processor createProcessor()
            之后的都是看网上的,待后再看
            processor.setAdapter(proto.adapter);
            
            adapter---》CoyoteAdapter
            
            
            StandardEngin容器默认管道StandardEnginValve
            
            StandardHost ---》StandardHostValue
            StandardHostValue则选择相应的Context容器
            StandardContext默认情况下配置了StandardContextValve
            之后选择一个合适的Wrapper容器。
            StandardWrapper容器默认情况下配置了StandardWrapperValve。
            是启动过滤器FilterChain,对请求执行过滤操作。2)执行service方法。
            
            补充说明,StandardWrapper容器是对于Servlet的包装,
            所有的Request的资源可以分成4种不同的类型,
            静态资源请求(HTML,图片,CSS等),JSP请求,Servlet请求,以及CGI请求。
            对于不同的请求Tomcat用WebdavServlet处理静态资源文件,JspServlet处理Jsp请求,CGIServlet处理CGI请求。
 ================JIoEndpoint 处理请求==================
 
 
 =======解释========
  猜 因为用的http协议是1.1,所以最后用到的是Http11Protocol
  
  public interface Handler extends AbstractEndpoint.Handler
 的实现类有如下

java.org.apache.coyote   
    AbstractProtocol<S>
    AbstractConnectionHandler<S, P> (potential match)

java.org.apache.coyote.ajp  
    AjpAprProtocol
    AjpNioProtocol
    AjpProtocol
java.org.apache.coyote.http11  
    Http11AprProtocol
    Http11NioProtocol
    Http11Protocol
java.org.apache.naming.factory.webservices -  
    ServiceRefFactory
    initHandlerChain(QName, HandlerRegistry, HandlerInfo, ArrayList<String>) (2 potential matches)
java.org.apache.tomcat.util.net  
    AprEndpoint
    JIoEndpoint
    NioEndpoint
 
  =======解释========
  
   》》》》》》》》》》》》》》》JIoEndpoint》》》》》》》》》》》》》》》》》》》 

 

posted on 2014-10-28 17:32  rojas  阅读(413)  评论(0编辑  收藏  举报