传说用户发来的请求是在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》》》》》》》》》》》》》》》》》》》 

 

你可能感兴趣的:(tomact)