springboot中tomcat的启动(九)请求进来的流程

当一个请求访问springboot的接口的时候,会被Nio的selector轮询到

一、入口

轮询的方法是在NioEndPoint端点的内部类SocketProcessor类中的doRun()方法,然后进入如下方法中

state = getHandler().process(socketWrapper, event);

然后进入Http11Processor类的process方法中,因为请求进来,先进行读操作,所以先进入如下方法:

} else if (status == SocketEvent.OPEN_READ){
                state = service(socketWrapper);

这个方法进入后,前面先进行一通判断,如果没有错误的话,进入如下代码:

            if (!getErrorState().isError()) {
                try {
                    rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);
                    getAdapter().service(request, response);

这个adapter就是我们之前说过的CoyoteAdapter,它的作用跟之前介绍的一样,是为了将tomcat的request,response转为spring的HttpServletRequest,HttpServletResponse。如果转换成功,则进入tomcat的管道,依次执行tomcat中管道的工作:

            if (postParseSuccess) {
                //check valves if we support async
                request.setAsyncSupported(
                        connector.getService().getContainer().getPipeline().isAsyncSupported());
                // Calling the container
                connector.getService().getContainer().getPipeline().getFirst().invoke(
                        request, response);
            }

二、管道

tomcat的管道常规情况按如下顺序执行:

StandardEngineValve
ErrorReportValve
StandardHostValve
StandardContextValve
StandardWrapperValve

三、Filter

执行完管道任务后,就通过tomcat的ApplicationFilterChain类进入了spring的fiter中,开始执行spring的filter了。

四、序列图

其序列图如下:

NioEndPoint$S SocketProcessor AbstractPro Http11processor CoyoteAdapter StandardEngineValve doRun() process() service() service() invode() 管道和filte r后面的序列就比 较简单,此处不写 了 NioEndPoint$S SocketProcessor AbstractPro Http11processor CoyoteAdapter StandardEngineValve

你可能感兴趣的:(tomcat)