xinjiang 发表于 2017-2-10 12:47:36

Tomcat源码解读--代码走读之JIoEndpoint$SocketProcessor.run(四十八)

      这部分是线程池里某一个线程的执行过程,如下图。代码参考JIoEndpoint.java
  

 
  1、SSL handshake,serverSocketFactory.handshake(socket.getSocket()),里面没有方法执行。
  2、state = handler.process(socket,SocketStatus.OPEN),(其中handler就是JIoEndpoint的属性,SocketProcessor属于内部类,所以属性共用,十五章中的1介绍过handler初始化),handler是Http11Protocol$Http11ConnectionHandler。调用process就是调用父类AbstractConnectionHandler(属于AbstractProtocol的内部类)的process方法。
(1)、P processor = connections.remove(socket.getSocket()),因为connections=空,所以processor=null;
(2)、processor = recycledProcessors.poll(),其中RecycledProcessors<P,S> recycledProcessors =new RecycledProcessors<P,S>(this),this= Http11Protocol$Http11ConnectionHandler,在AbstractProtocol类中,代码如下。
  

 
   1)、调用ConcurrentLinkedQueue<E>的poll方法。
(3)、processor = createProcessor(),也就是调用Http11Protocol$Http11ConnectionHandler的createProcessor()
  

 
   1)、创建HTTP1Processor对象。调用父类Http11Processor构造方法,调用父类AbstractHttp11Processor构造方法,调用父类AbstractProcessor构造方法。
   2)、设置属性。
   3)、register(processor),代码如下,主要是requestInfo设置属性和注册Mbean。
  

 
(4)、initSsl,判断是否支持SSL。
(5)、state = processor.process(socket),调用父类AbstractHttp11Processor类的process方法。代码 在AbstractHttp11Processor.java中。
    1)、Setting up the I/O
    2)、设置属性。
    3)、prepareRequest(),主要是设置request属性。
    4)、adapter.service(request, response),后续介绍。
       1))、这里解释一下adapter的由来
           1)))、adapter属于AbstractProcessor的属性
           2)))、在创建processor是设置的。
  

 
            3)))、其中proto是在创建Http11ConnectionHandler对象时设置,proto也就是Http11Protocol对象和protocolHandler。
  

 
            4)))、其中Http11ConnectionHandler对象是在构建Http11Protocol时设置,其中this为当前对象Http11Protocol。

  

 
            5)))、其中Http11Protocol是在构建Connector时创建,protocolHandler也就是Http11Protocol对象。
  

 
             6)))、adapter是在connector的init时创建
  

 
    2))、总结一下就是endpoint中有handler,handler中有protocol来创建processor并且设置属性,processor中adapter,adapter中有connector。如下图黑线为包含,红线为指向。
  

 
5)、AbstractHttp11Processor的process方法剩下部分,后续介绍。
(6)、AbstractConnectionHandler的process方法剩下部分,后续介绍。
3、SocketProcessor的run方法剩下部分,后续介绍。
 
页: [1]
查看完整版本: Tomcat源码解读--代码走读之JIoEndpoint$SocketProcessor.run(四十八)