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