先码后看 Tomcat是怎么启动的?——StandardService 侵立删
来源:互联网 发布:晋明帝 司马懿 知乎 编辑:程序博客网 时间:2024/05/21 18:45
一般启动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 处理一次请求顺序图
- 先码后看 Tomcat是怎么启动的?——StandardService 侵立删
- 先码后看 Tomcat是怎么启动的?——概论 侵立删
- 先码后看 Tomcat是怎么启动的?——Bootstrap引导 侵立删
- 先码后看 Tomcat是怎么启动的?——时序分析 侵立删
- 先码后看 Tomcat是怎么启动容器的——Digester篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——Lifecycle篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——Context篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——web.xml篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——web.xml应用 侵立删
- Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动
- 先码后看 Tomcat怎么启动容器的——Boostrap篇 侵立删
- 知识库--tomcat+StandardService
- Linux是怎么启动的
- Linux是怎么启动的
- Linux是怎么启动的
- Linux是怎么启动的
- Linux是怎么启动的
- Tomcat是如何启动及运行—对tomcat的源码解析
- maven scope编译的范围
- nyoj82 迷宫寻宝(一) (搜索)
- poj3140——contestants division
- 教你一步一步用c语言实现sift算法
- 11月5日训练笔记
- 先码后看 Tomcat是怎么启动的?——StandardService 侵立删
- 安卓actionbar上的搜索按钮点击没反应如何解决
- 网易云深度学习第二课Notebook3
- 第十四天 列表生成式或列表生成器
- filter web.xml
- 医学信号数据集
- JSP指令
- Java并发之Future类和Callable类详解
- OpenJDK和JDK区别