引言

经过几篇的分析,终于将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的请求处理过程。