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方法剩下部分,后续介绍。
?