Tomcat启动过程分析(上)

一般启动Tomcat会是运行startup.bat或者startup.sh文件,实际上这两个文件最后会调用org.apache.catalina.startup.Bootstrap类的main方法,

这个main方法主要做了两件事情,1:定义和初始化了tomcat自己的类加载器,2:通过反射调用了org.apache.catalina.startup.Catalina的process方法

process的功能1:如果catalina.home和catalina.base两个属性没有设置就设置一下,2:参数正确的话就调用execute方法,execute的方法就是简单的调用start方法,其中在判断参数正确的方法arguments中会设置starting标识为true,这样在execute方法中就能调用start方法,start方法是重点,在它里面启动了我们的Tomcat所有的服务。

start方法功能:最重要的方法是createStartDigester();和((Lifecycle) server).start();createStartDigester方法主要的作用就是帮我们实例化了所有的服务组件包括server,service和connect,start方法就是启动服务实例了。

Digester是一个外部jar包里面的类,主要的功能就是解析xml里面的元素并把元素生成对象,把元素的属性设置成对象的属性,并形成对象间的父子兄弟等关系。调用digester.parse(is)方法后就会根据模式和server.xml文件来生成对象以及他们之间的相互关系。这样我们便有了服务器组件StandardServer的对象,也有了它的子组件StandardService对象等等。

Start执行到server.initialize();  ((Lifecycle) server).start();tomcat就实现了启动服务器组件StandardServer。StandardServer的start方法关键代码是启动它的子组件StandardService,StandardService的start方法跟StandardServer的start方法差不多,是启动它的连接器和容器,一个Service包含一个容器和多个连接器。


默认的连接器是HttpConnector,所以会调用HttpConnector的start方法。有两个关键的类:HttpConnector和HttpProcessor,它们都实现了Runnable接口,HttpConnector负责接收http请求,HttpProcessor负责处理由HttpConnector接收到的请求。注意这里HttpProcessor会有很多的实例,最大可以有maxProcessor个,初始化是20个。所以在threadStart方法中会启动一个后台线程来接收http连接。这样,就会启动HttpConnector后台线程,它的run方法不断循环,主要就是新建一个ServerSocket来监听端口等待连接,得到连接后给HttpProcessor的实例processor来处理,serverSocket则继续循环监听。在循环里面内,serverSocket.accept()负责接收http请求然后赋值给socket,最后交给其中一个processor处理。这里processor并不是等到需要的时候再实例化,而是在HttpConnector初始化的时候已经有了若干个processor放入了Stack中,每次createProcessor时从stack中pop出一个就可以。HttpProcessor的run方法一开始便是调用await方法来等待。所以HttpProcessor会一直阻塞,直到有线程来唤醒它。当从HttpConnector中调用processor.assign(socket),会把socket传给此HttpProcessor对象,并设置available为true,调用notifyAll()唤醒该processor线程以处理socket。同时,在await方法中又把available设置成false,因此又回到初始状态,即可以重新接受socket。

处理socket的方法是process(socket),主要作用有两点,

1:解析这个socket,即解析http请求,包括请求方法,请求协议等,以填充request,response对象。

2:传入request,response对象给和HttpConnector绑定的容器,让容器来调用invoke方法进行处理。



Connector 处理一次请求顺序图

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Tomcat启动流程可以通过对源码的分析来理解。在Tomcat中,整个启动和关闭过程是按照一定规则进行的,通过Lifecycle接口来管理组件的生命周期。\[2\]在启动过程中,父组件会调用子组件的init()和start()方法。因此,只要调用最顶层组件也就是Server组件的init()和start()方法,整个Tomcat就会被启动起来。\[2\] 在启动过程中,涉及到的组件需要进行初步梳理,并结合server.xml中的标签来理解各个组件的作用。可以通过Tomcat的架构设计图来进行梳理和修正。\[1\]在启动过程中,还涉及到了模板方法的设计模式,其中抽象方法会被具体的子类实现。这个过程可能会有一些绕,但是通过对源码的调试和理解,可以逐步搞清楚整个启动流程。\[1\] 此外,由于Tomcat定义了自己的Request类来存放客户端发来的请求信息,而这个Request对象不是标准的ServletRequest。为了解决这个问题,Tomcat引入了CoyoteAdapter,通过适配器模式将Tomcat Request转换成ServletRequest,再调用容器的Service方法。\[3\] 总结起来,Tomcat启动流程可以通过对源码的分析和调试来理解,其中涉及到组件的初始化和启动过程,以及对请求信息的处理和适配。 #### 引用[.reference_title] - *1* [Tomcat-启动流程](https://blog.csdn.net/wyy546792341/article/details/126576803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Tomcat主要结构和启动流程](https://blog.csdn.net/songcf_faith/article/details/124653240)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值