学习Tomcat(二)之容器概览 (2)

Tomcat容器在关闭的时候会通知所有的子组件(service组件)容器关闭事件,service组件再通知它的所有子组件容器关闭事件。事件通过父子关系层层传递到各个组件,从而实现组件之间的生命周期管理。

Tomcat结构图


事实上Tomcat容器的生命周期事件不仅仅包含启动/关闭,而是更详细的划分了启动关闭的各个阶段,分为以下代码示例中的各个事件。

public static final String BEFORE_INIT_EVENT = "before_init"; public static final String AFTER_INIT_EVENT = "after_init"; public static final String START_EVENT = "start"; public static final String BEFORE_START_EVENT = "before_start"; public static final String AFTER_START_EVENT = "after_start"; public static final String STOP_EVENT = "stop"; public static final String BEFORE_STOP_EVENT = "before_stop"; public static final String AFTER_STOP_EVENT = "after_stop"; public static final String AFTER_DESTROY_EVENT = "after_destroy"; public static final String BEFORE_DESTROY_EVENT = "before_destroy"; public static final String PERIODIC_EVENT = "periodic"; public static final String CONFIGURE_START_EVENT = "configure_start"; public static final String CONFIGURE_STOP_EVENT = "configure_stop"; Service服务组件

Server中Service的配置如下所示,Service组件包含两种组件:连接器和Servlet容器,其中servlet容器只有一个,连接器可以由多个。多个连接器可以使Tomcat为多种不同的请求协议提供服务,比如一个处理HTTP请求,另外一个处理HTTPS请求。

连接器负责将Socket请求解析为Request和Response,而Servlet容器则负责根据业务逻辑处理请求中的Request和Response,Service服务组件则负责把二者关联起来。我会在其它文章中详细介绍Servlet容器和连接器Connector。

每个连接器组件Connector都可以指定一个Servlet容器处理其解析得到的Request和Response,所以Service的功能比较简单,就是为Service中的每个组件设置Servlet容器。

<Service> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> </Engine> </Service> Server的其它配置 全局资源GlobalNamingResources

提供了容器级别的JNDI资源配置。比如下面的默认配置,就提供了Tomcat用户数据的JNDI,存储在conf/tomcat-users.xml中。容器资源对容器的依赖性比较高,现在的使用场景比较少。

<GlobalNamingResources> <Resource auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> 监听器Listener

监听器用来监听容器的特定事件,如容器的启动关闭事件等。如下所示,默认的server.xml中包含了5个监听器,我们接下来会简单介绍默认监听器的功能。

<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> </Server>

VersionLoggerListener:在容器启动前打印各种版本信息,如JVM版本、操作系统版本、tomcat版本等信息。

AprLifecycleListener:APR的生命周期处理,APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。

JreMemoryLeakPreventionListener:用于处理上下文类加载器可能出现的内存泄露问题,启动Java内存自动回收任务,每小时触发FullGC。

GlobalResourcesLifecycleListener:Tomcat启动时实例化JNDI资源的MBean,Tomcat停止时销毁MBean.

ThreadLocalLeakPreventionListener:在Context关闭的时候清空线程上下文,防止ThreadLocal内存泄露。

我是御狐神,欢迎大家关注我的微信公众号:wzm2zsd

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfjzs.html