Tomcat一次请求处理的前世今生(一) 处理线程的产生

本文详细介绍了Tomcat在默认配置下如何创建和启动处理请求的线程。从server.xml配置文件中的Connector节点开始,解析了如何通过Digester读取配置,进而生成Connector对象。接着,通过分析Connector的构造方法和start方法,揭示了Http11Protocol和JIoEndpoint的角色,以及如何启动http-bio-8080-Acceptor-0和http-bio-8080-AsyncTimeout这两个关键线程。最后,提到了AJP连接器的线程启动方式与其类似。
摘要由CSDN通过智能技术生成

在默认的配置下Tomcat启动好之后会看到后台上总共有6个线程在运行。其中1个用户线程,剩下5个为守护线程(如下图所示)。


如果你对用户线程、守护线程等概念不熟悉,请参看前一篇文章——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节点时是这么处理的:

Java代码   收藏代码
  1. digester.addRule("Server/Service/Connector",  
  2.                  new ConnectorCreateRule());  
  3. digester.addRule("Server/Service/Connector",  
  4.                  new SetAllPropertiesRule(new String[]{ "executor"}));  
  5. digester.addSetNext("Server/Service/Connector",  
  6.                     "addConnector",  
  7.                     "org.apache.catalina.connector.Connector");  

以上代码见org.apache.catalina.startup.Catalina类的366到372行。所以在碰到server.xml文件中的Server/Service/Connector节点时将会触发ConnectorCreateRule类的begin方法的调用:

Java代码   收藏代码
  1. public void begin(String namespace, String name, Attributes attributes)  
  2.         throws Exception {  
  3.     Service svc = (Service)digester.peek();  
  4.     Executor ex = null;  
  5.     if ( attributes.getValue("executor")!=null ) {  
  6.         ex = svc.getExecutor(attributes.getValue("executor"));  
  7.     }  
  8.     Connector con = new Connector(attributes.getValue("protocol"));  
  9.     if ( ex != null )  _setExecutor(con,ex);  
  10.       
  11.     digester.push(con);  
  12. }  

在第8行,会根据配置文件中Server/Service/Connector节点的protocol属性调用org.apache.catalina.connector.Connector类的构造方法,而默认情况下server.xml文件中Server/Service/Connector节点共有两处配置:

Xml代码   收藏代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值