一个请求到达tomcat之后,Connector接收该请求并将接收的请求封装为Request,交给Container处理并返回Response处理结果。
-Dcatalina.home=E:\soft\tomcat8\apache-tomcat-8.5.61-src\source
-Dcatalina.base=E:\soft\tomcat8\apache-tomcat-8.5.61-src\source
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:\soft\tomcat8\apache-tomcat-8.5.61-src\source\conf\logging.properties
-Dfile.encoding=UTF-8
针对架构图就有了4个问题:
Connector如何建立连接请求?
Bootstrap初始化流程
#main
#init 实例化Catalina
#load
Catalina#load
Server#init
LifecycleBase#init
StandardServer#initInternal
Service#initInternal
Connector#initInternal
ProtocolHandler#init
AbstractProtocol#init
AbstractEndpoint#init
NioEndpoint#bind 绑定连接监听端口,创建ServerSocketChannel
Bootstrap启动流程
#start
Catalina#start
Server#startInternal
Service#startInternal
处理连接请求
Connector#startInternal
protocolHandler#start
endpoint#start
AbstractEndpoint#startAcceptorThreads 开启多个Acceptor线程,即selector线程, 创建SocketChannel,并将SocketChannel注册至Selector上
NioEndpoint#startInternal 开启一个处理请求的Poller线程
#processKey
AbstractEndpoint#processSocket
SocketProcessor#doRun
ConnectionHandler#process 处理请求…
部署应用
ContainerBase#startInternal
StartChild#start 只针对Engine的Host放入startStopExecutor去异步执行
StandardHost#startInternal(StarndardContext#start,StandardWrapper#start)
HostConfig#lifecycleEvent
#start
#deployApps
#deployDirectories
Connector如何将请求封装Request和Response?
Connector如何将Request交给Container处理?
紧接着第一步Connector如何建立连接请求:
AbstractProcessorLight(Processor子类)#process
Http11Processor#service
CoyoteAdapter#service 将Request,Response转成HttpServletRequest,HttpServletResponse
org.apache.catalina.core.StandardEngineValve#invoke 使用Pipeline-Value管道来处理
AbstractAccessLogValve#invoke
ErrorReportValve#invoke
StandardHostValve#invoke
NonLoginAuthenticator#invoke
StandardContextValve#invoke
StandardWrapperValve#invoke
#createFilterChain 将请求封装成链式任务
ApplicationFilterChain#doFilter
#internalDoFilter
HttpServlet#service 至此将请求信息交给servelt处理
Container如何匹配请求的Servelt?
CoyoteAdapter#service
#postParseRequest 根据请求信息找到能够处理当前请求的HOST->CONTEXT->WRAPPER(SERVELT)
Mapper#map
#internalMap 找到匹配的Servelt
Mapper在什么时候初始化?
Bootstrap启动流程
#start
Catalina#start
Server#startInternal
Service#startInternal
Mapper添加信息
MapperListener#start
#startInternal
#registerHost
Container如何将请求处理返回给客户端?
紧接第三步,HttpServlet#service 至此将请求信息交给servelt处理:
HttpServlet#service
DefaultServlet#service
#serveResource 封装处理结果交给Connector,Connector在通过Socket的方式将结果返回给客户端
#registerHost
Container如何将请求处理返回给客户端?
紧接第三步,HttpServlet#service 至此将请求信息交给servelt处理:
HttpServlet#service
DefaultServlet#service
#serveResource 封装处理结果交给Connector,Connector在通过Socket的方式将结果返回给客户端