Tomcat源码系列:
- Tomcat初始化源码流程分析(图解及源码注释) (一)
- Tomcat初始化源码流程分析(图解及源码注释) (二)
- Tomcat启动源码流程分析(图解及源码注释) (三)
- Tomcat启动源码流程分析(图解及源码注释) (四)
- Tomcat请求源码流程分析(图解及源码注释) (五)
- Tomcat请求源码流程分析(图解及源码注释) (六)
本章为Tomcat请求解析流程的第二章,主要内容为在请求转交给Coyote适配器后的流程分析
紧接上文中请求交由Processor处理.
Tomcat初始化源码不适用于新手
文章内容只有部分流程的源码分析,通过代码注释的方法,仅适用于Tomcat的源码有一定的了解的同学.
目录
1.AbstractProcessorLight.process()
3.1 StandardEngineValve.invoke()
3.2 StandardHostValve.invoke()
3.3 StandardContextValve.invoke()
3.4 StandardWrapperValve.invoke()
4.wrapper.allocate() 构造Servlet实例
5. filterChain.doFilter(request.getRequest(),response.getResponse())
5.1 internalDoFilter(request,response);
5.2 servlet.service(request, response);
1.AbstractProcessorLight.process()
当请求由Endpoint交由Processor处理时,首先经过的就是AbstractProcessorLight.process()
public SocketState process(SocketWrapperBase<?> socketWrapper, SocketEvent status)
throws IOException {
SocketState state = SocketState.CLOSED;
Iterator<DispatchType> dispatches = null;
do {
if (dispatches != null) {
DispatchType nextDispatch = dispatches.next();
if (getLog().isDebugEnabled()) {
getLog().debug("Processing dispatch type: [" + nextDispatch + "]");
}
state = dispatch(nextDispatch.getSocketStatus());
if (!dispatches.hasNext()) {
state = checkForPipelinedData(state, socketWrapper);
}
} else if (status == SocketEvent.DISCONNECT) {
} else if (isAsync() || isUpgrade() || state == SocketState.ASYNC_END) {
state = dispatch(status);
state = checkForPipelinedData(state, socketWrapper);
} else if (status == SocketEvent.OPEN_WRITE) {
// Extra write event likely after async, ignore
state = SocketState.LONG;
} else if (status == SocketEvent.OPEN_READ) {
//调度Http11Processor.service方法
state = service(socketWrapper);
} else if (status == SocketEvent.CONNECT_FAIL) {