• 传说用户发来的请求是在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》》》》》》》》》》》》》》》》》》》 
  • 相关阅读:
    [转]项目需求范围管理
    JavaScript 王者归来
    [转]大文件上传组件
    [转]使用vs2005自带的sql2005 express
    JS判断Caps Lock
    [转]Web项目管理思考
    [转]JS严格验证身份证
    两分钟用C#搭建IE BHO勾子, 窃取密码
    asp.net性能提升十个方法(Microsoft)
    [转]Asp.net 将js文件打包进dll 方法
  • 原文地址:https://www.cnblogs.com/rojas/p/4057388.html
Copyright © 2020-2023  润新知