前面的分析到,请求最终被封装成了一个SocketProcessor对象,放在Executors线程池中去执行。这些都还只是在tomcat内部的socket的处理层面上,那请求最终是如何被转到开发人员所写的servlet上的?
NioEndpoint.SocketProcessor所做的工作在私有方法doRun中
if
(handshake == 0) {
SocketState state = SocketState.OPEN;
// Process the request from this socket
if
(status ==
null
) {
state = handler.process(ka, SocketStatus.OPEN_READ);
}
else
{
state = handler.process(ka, status);
}
通过代码可以看出,SocketProcessor中主要做一些握手检查和资源回收的工作,在
握手工作正常完成后,请求被转到handler.process进行处理。
前面在分析Connector时了解到,Connector默认使用的是
org.apache.coyote.http11.Http11NioProtocol
作为ProtocolHandler。