Tomcat7中一次请求处理的前世今生(一)处理线程的产生
如果你对用户线程、守护线程等概念不熟悉,请参看前一篇文章——Tomcat7服务器关闭原理。
这里重点关注以http-bio-8080开头的两个守护线程(即http-bio-8080-Acceptor-0和http-bio-8080-AsyncTimeout),因为这是我们在Tomcat的默认配置下发布web应用时实际处理请求的线程。先看下这两个线程在容器启动时是如何产生和启动的。
在前面将Tomcat启动的系列文章中看到Tomcat容器启动时会用Digester读取server.xml文件产生相应的组件对象并采取链式调用的方式调用它们的init和start方法,在Digester读取到server.xml中的connector节点时是这么处理的:
先看第一个Connector节点,调用Connector的构造方法时会传入字符串HTTP/1.1
?
接下来容器启动各组件时会调用org.apache.catalina.connector.Connector的start方法,如前面分析Tomcat启动时所述,此时会调用org.apache.catalina.connector.Connector类的startInternal方法:在第12行,将会调用实例变量protocolHandler的start方法。在上面分析Connector类的构造函数时发现protocolHandler变量的值就是org.apache.coyote.http11.Http11Protocol对象,所以此时将会调用该类的start方法。在Http11Protocol类中没有定义start方法,这里将会调用其父类org.apache.coyote.AbstractProtocol中的start方法:
?
在这里将产生和启动http-bio-8080-Acceptor-0线程。注意在构造该线程时第6行将会调用第20行的抽象方法,该方法的具体实现是在JIoEndpoint类中:
同理,ajp-bio-8009-Acceptor-0和ajp-bio-8009-AsyncTimeout两个守护线程的产生和启动方式也是一致的,不再赘述。?
1 楼 helloqiner 2013-08-21 如果自己控制tomcat的启动(嵌入式使用),不通过xml直接硬编码的话,如设置线程池数量,设置nio的连接器,启动失败时(端口占用)等捕获? 2 楼 Tyrion 2013-08-21 helloqiner 写道如果自己控制tomcat的启动(嵌入式使用),不通过xml直接硬编码的话,如设置线程池数量,设置nio的连接器,启动失败时(端口占用)等捕获?
可以啊,直接修改Catalina的源码,在load方法里把里面Digester解析产生对象的地方用你自己的方式替换掉。 3 楼 yangsong158 2013-08-22 这样的文章,必需上首页。有质量。 4 楼 zhongmin2012 2013-08-23 必须上首页,哈哈