设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 服务器 > 系统 > 正文

【深入揭秘Tomcat服务器底层原理】扒下这只又爱又恨的“Tom猫”(3)

发布时间:2019-11-27 12:48 所属栏目:52 来源:站长网
导读:按照 xml 的配置关系,server 的子元素是 service,service 的子元素是顶层容器 Engine,每层容器都持有自己的子容器,而这些元素都实现了生命周期管理的各个方法,因此就很容易的完成整个容器的启动、关闭等生命周

按照 xml 的配置关系,server 的子元素是 service,service 的子元素是顶层容器 Engine,每层容器都持有自己的子容器,而这些元素都实现了生命周期管理的各个方法,因此就很容易的完成整个容器的启动、关闭等生命周期的管理。

StandardServer 完成 init 和 start 方法调用后,会一直监听来自 8005 端口(可配置)。

如果接收 到 shutdown 命令,则会退出循环监听,执行后续的 stop 和 destroy 方法,完成 Tomcat 容器的关闭。

同时也会调用 JVM 的 Runtime.getRuntime()﴿.addShutdownHook 方法,在虚拟机意外退出的时候来关闭容器。

所有容器都是继承自 ContainerBase,基类中封装了容器中的重复工作,负责启动容器相关的组件 Loader、Logger、Manager、Cluster、Pipeline,启动子容器(线程池并发启动子容器,通过线程池 submit 多个线程,调用后返回 Future 对象,线程内部启动子容器,接着调用 Future 对象 的 get 方法来等待执行结果)。

List<future> results = new ArrayList<future>();  

for (int i = 0; i < children.length; i++) {  

results.add(startStopExecutor.submit(new StartChild(children[i])));  

 

boolean fail = false;  

for (Futureresult :results) {  

try {  

result.get();  

} catch (Exception e) {  

log.error(sm.getString("containerBase.threadedStartFailed"), e);  

fail = true;  

}  

Web 应用的部署方式

注:catalina.home:安装目录;catalina.base:工作目录;默认值 user.dir

Server.xml 配置 Host 元素,指定 appBase 属性,默认\$catalina.base/webapps/

Server.xml 配置 Context 元素,指定 docBase,元素,指定 web 应用的路径

自定义配置:在\$catalina.base/EngineName/HostName/XXX.xml 配置 Context 元素

HostConfig 监听了 StandardHost 容器的事件,在 start 方法中解析上述配置文件:

扫描 appbase 路径下的所有文件夹和 war 包,解析各个应用的 META-INF/context.xml,并 创建 StandardContext,并将 Context 加入到 Host 的子容器中。

解析$catalina.base/EngineName/HostName/下的所有 Context 配置,找到相应 web 应 用的位置,解析各个应用的 META-INF/context.xml,并创建 StandardContext,并将 Context 加入到 Host 的子容器中。

注:

HostConfig 并没有实际解析 Context.xml,而是在 ContextConfig 中进行的。

HostConfig 中会定期检查 watched 资源文件(context.xml 配置文件)

ContextConfig 解析 context.xml 顺序:

先解析全局的配置 config/context.xml

然后解析 Host 的默认配置 EngineName/HostName/context.xml.default

最后解析应用的 META-INF/context.xml

ContextConfig 解析 web.xml 顺序:

先解析全局的配置 config/web.xml

然后解析 Host 的默认配置 EngineName/HostName/web.xml.default 接着解析应用的 MEB-INF/web.xml

扫描应用 WEB-INF/lib/下的 jar 文件,解析其中的 META-INF/web-fragment.xml 最后合并 xml 封装成 WebXml,并设置 Context

注:

扫描 web 应用和 jar 中的注解(Filter、Listener、Servlet)就是上述步骤中进行的。

容器的定期执行:backgroundProcess,由 ContainerBase 来实现的,并且只有在顶层容器 中才会开启线程。(backgroundProcessorDelay=10 标志位来控制)

Servlet 生命周期

【深入揭秘Tomcat服务器底层原理】扒下这只又爱又恨的“Tom猫”

Servlet 是用 Java 编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

请求到达 server 端,server 根据 url 映射到相应的 Servlet

判断 Servlet 实例是否存在,不存在则加载和实例化 Servlet 并调用 init 方法

Server 分别创建 Request 和 Response 对象,调用 Servlet 实例的 service 方法(service 方法 内部会根据 http 请求方法类型调用相应的 doXXX 方法)

doXXX 方法内为业务逻辑实现,从 Request 对象获取请求参数,处理完毕之后将结果通过 response 对象返回给调用方

当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方 法。

load on startup 

当值为 0 或者大于 0 时,表示容器在应用启动时就加载这个 servlet; 当是一个负数时或者没有指定时,则指示容器在该 servlet 被选择时才加载; 正数的值越小,启动该 servlet 的优先级越高;

single thread model 

每次访问 servlet,新建 servlet 实体对象,但并不能保证线程安全,同时 tomcat 会限制 servlet 的实例数目。

请求处理过程

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读