Tomcat源码---容器生命周期管理(Lifecycle)一
一,tomcat中每一个容器都有其生命周期,初始化/启动/结束 等,可以在各自的生命周期内的步骤中进行一系列需要的操作如日记通知,生命周期中采用最独特的设计模式,就是适配器模式(Addapter),与命令模式(Command)
在一个周期内涉及到的类是:(Lifecycle,LifecycleSupport(适配器),LifecycleEvent,LifecycleListener(命令))
在这里以StandardServer容器为例:
在server.xml被Digester类读取时添加了四个监听器:server.xml中
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
StandardServer 在初始化时又作了以下操作
public final class StandardServer
implements Lifecycle, Server, MBeanRegistration
/**
* The lifecycle event support for this component.
*LifecycleSupport适配器,依赖于Lifecycle
*/
private LifecycleSupport lifecycle = new LifecycleSupport(this);
//构造函数
public StandardServer() {
super();
ServerFactory.setServer(this);
globalNamingResources = new NamingResources();
globalNamingResources.setContainer(this);
if (isUseNaming()) {
if (namingContextListener == null) {
namingContextListener = new NamingContextListener();
//添加进lifecyclesupport中,加这个support中总共有五个监听器
addLifecycleListener(namingContextListener);
}
}
//----------------------以上步骤为监听器的添加,添加完监听器,接下去就事件触发监听
public void start() throws LifecycleException {
// Validate and update our current component state
if (started) {
log.debug(sm.getString("standardServer.start.started"));
return;
}
// Notify our interested LifecycleListeners
//事件触发为:开始启动前以下的lifecycle(LifecycleSupport上面定义的)
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT(Lifecycle中定义了一系列的事件), null);
//正在启动
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
// Start our defined Services
synchronized (services) {
for (int i = 0; i < services.length; i++) {
if (services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();
}
}
// Notify our interested LifecycleListeners
//启动完
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
}
LifecycleSupport下查看如何触发:
//
public void fireLifecycleEvent(String type, Object data) {
//首先创建一个事件驱动,传到监听器中,监听器会根据事件的不同作出相应的操作
LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
LifecycleListener interested[] = listeners;
for (int i = 0; i < interested.length; i++)
interested[i].lifecycleEvent(event);
}
在这里贴出AprLifecycleListener的事件触发
public void lifecycleEvent(LifecycleEvent event) {
if (Lifecycle.INIT_EVENT.equals(event.getType())) {
//日记打印.
aprInitialized = init();
if (aprInitialized) {
try {
initializeSSL();
} catch (Throwable t) {
if (!log.isDebugEnabled()) {
log.info(sm.getString("aprListener.sslInit"));
} else {
log.debug(sm.getString("aprListener.sslInit"), t);
}
}
}
} else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
if (!aprInitialized) {
return;
}
try {
terminateAPR();
} catch (Throwable t) {
if (!log.isDebugEnabled()) {
log.info(sm.getString("aprListener.aprDestroy"));
} else {
log.debug(sm.getString("aprListener.aprDestroy"), t);
}
}
}
}
日记为:
2010-3-31 7:38:50 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\P......
这个命令模式跟java.awt中的addActionListener()是一样的,先添加所需的监听器根据不同的事件作出响应.
UML:
-----------------------------------------------------------------------------------------------------------
tomcat中所需要的日记,错误信息以及国际化是通过StringManager管理的
他是通过组合java.util.ResourceBundle进行管理,里面最主要的特点是,tomcat是通过各个不同的包进行日记管理
private StringManager(String packageName) {
String bundleName = packageName + ".LocalStrings";
try {
bundle = ResourceBundle.getBundle(bundleName);
----...