当一个请求访问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的管道常规情况按如下顺序执行:
三、Filter
执行完管道任务后,就通过tomcat的ApplicationFilterChain类进入了spring的fiter中,开始执行spring的filter了。
四、序列图
其序列图如下: