Bootstrap.main()->Bootstrap.init()
BootStrap.init()
bootstrap.init() 方法中设置catalinaDaemon
Bootstrap.main()->Bootstrap.start()->Catalina.start()->Catalina.load()->Catalina.createStartDigester()
server.xml 配置
通过protocol协议来判断使用那个protocolHandler。
tomcat 默认配置 是以BIO的模式启动的,默认会调用org.apache.coyote.http11.Http11Protocol。 下面我们以Http11Protocol来分析Connector。
startInternal() 方法
Http11Protocol 构造方法
public class JIoEndpoint extends AbstractEndpoint
JIoEndpoint 继承 AbstractEndpoint
start()
在这创建connector的socket服务,使用serverSocket监听入站连接。
server.xml 中配置如下: <Connector port="8080" protocol="HTTP/1.1" acceptorThreadCount="2" redirectPort="8443"/>
acceptorThreadCount 个数建议和CPU的个数一致。
createExecutor() 方法
默认创建的线程池,最小线程数为10,最大线程数为200,空闲时间为60秒,队列为LinkedBlockingQueue,队列大小默认为Ineteger.MAX_VALUE。
这里需要注意的是,如果队列中的元素没有存满,那么线程的数量一直会是10,而不会自动扩大到200。所以建议大家自己设置一个线程池,而不要用默认的
把socket封装成SocketWrapper对象 传给SocketProcessor对象,并提交给线程池处理。
负责解析http协议信息。 SOcketProcessor重要属性
Paste_Image.png
inputBuffer:包装socket的inputStream,并解析http协议信息。 outputBuffer:包装socket的outputStream,负责响应用户的数据。
run() 方法
在process方法中处理解析http协议信息。
Http11Protocol.process()->Http11Processor.process() 代码如下:
Http11Processor.process()
获取socket的输入流和输出流
在这里,构造Request和Response对象。
解析完后的数据存储到 AbstractInputBuffer的下面两个属性中
protected Request request;
protected MimeHeaders headers;
request对象就是 HttpServletRequest 对象的原型。
解析完之后,调用下面的service方法。
这里的service方法会调用servlet中的service方法并传入request和response对象,然后根据请求的方法来决定调用的是servlet的doGet方法还是doPost或其它的方法。
到此 Connector的整理流程就结束了。
根据协议来选择协议的处理类,tomcat默认的处理类是Http11Protocol。
主要负责解析http协议的
参数值根据自己项目做响应修改。下面的只是个例子
<Connector port="8080" protocol="HTTP/1.1"
acceptCount="1000"
disableUploadTimeout="true"
enableLookups="false"
keepAliveTimeout="20"
maxThreads="500"
minThreads="500"
maxProcessor="500"
minSpareThreads="20"
maxKeepAliveRequests="1"
connectionTimeout="20"
redirectPort="8443"
allowTrace="false"
acceptorThreadCount="2"
acceptorThreadPriority="7"
socket.tcpNoDelay="true"
threadPriority="8"
tcpNoDelay="true"
compression="on"
emptySessionPath="true"
/>