Tomcat源码分析【十七】请求处理过程分析之简单总结
引言
经过几篇的分析,终于将Tomcat请求处理过程分析完了,大概分为四个阶段:
Acceptor接收请求,将请求封装发送到Poller
- Acceptor启动后监听请求,阻塞在ServerSocketChannel.accept()方法处,当有新连接时,返回ScoketChannel。
- 将ScoketChannel封装为NioChannel,注册到Poller
- Poller的addEvent方法,将请求加入到PollerEvent队列中。
Poller监听事件,当Socket可读或者可写时,将Socket添加到Worker工作队列
- 每个Poller维护一个Selector,Poller启动后,阻塞在select方法
- 将Socket的SocketChannel注册到Selector上,当Socket可读时,Poller对其处理
- 将Socket封装到SocketProcessor中,加入到worker线程池中处理
Worker对请求进行封装,调用容器的pipeline,将请求交由Container
- Http11Processor将Socket解析,封装org.apache.coyote.Request
- CoyoteAdapter调用service(Request req, Response res)方法
这里的Request为org.apache.coyote.Request;Response为:org.apache.coyote.Response - 将请求和响应交由容器的valve处理, invoke(Request request, Response response)
这里的Request为org.apache.catalina.connector.Request;Response为:org.apache.catalina.connector.Response
Container通过层层Valva对请求进行处理
- Engine、Host、Context、Wrapper各层容器都相应注册各种Valve
- 主要看StandardWrapperValve的invoke处理
首先加载并初始化Servlet,之后创建过滤器链,最后执行过滤器链,在执行完毕之后会调用Servlet的service方法。
以上就是Tomcat的请求处理过程。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!