研究过tomcat源码的朋友们可能都发现了,tomcat中几个主要的component都实现了Lifecycle接口,并且在
start的时候通常都会publish一些事件。在这个过程中tomcat是通过Observer模式来实现相关功能的。下面以StandardHost为例来说明。
StandardHost是StandardContext(也就是部署在tomcat下面的一个个应用)的上级Container.Host是在Digester server.xml文件的时候生成的。但是,在digester的时候,并没有standardcontext的相关配置。那么,StandardContext是如何加载的呢?
下面就来研究一下standardhost的源码:
先来看init源码:
public void init() {
if( initialized ) return;
initialized=true;
// already registered.
if( getParent() == null ) {
try {
// Register with the Engine
ObjectName serviceName=new ObjectName(domain +
":type=Engine");
HostConfig deployer = new HostConfig();
addLifecycleListener(deployer);
if( mserver.isRegistered( serviceName )) {
if(log.isDebugEnabled())
log.debug("Registering "+ serviceName +" with the Engine");
mserver.invoke( serviceName, "addChild",
new Object[] { this },
new String[] { "org.apache.catalina.Container" } );
}
} catch( Exception ex ) {
log.error("Host registering failed!",ex);
}
}
if( oname==null ) {
// not registered in JMX yet - standalone mode
try {
StandardEngine engine=(StandardEngine)parent;
domain=engine.getName();
if(log.isDebugEnabled())
log.debug( "Register host " + getName() + " with domain "+ domain );
oname=new ObjectName(domain + ":type=Host,host=" +
this.getName());
controller = oname;
Registry.getRegistry(null, null)
.registerComponent(this, oname, null);
} catch( Throwable t ) {
log.error("Host registering failed!", t );
}
}
}
StandardHost本身是一个container(ContainerBase),从以上代码可以看出,它在初始化的时候注册了一个LifecycleListener:HostConfig. 不同于一般的Observer模式的地方是,standard并不直接拥有listeners,而是通过拥有一个工具类-LifecycleSupport来维护与listeners的关系。这样就使得代码看起来很干净。已经注册了Observer,那么在哪里触发事件呢?事件触发是在container启动的时候(其实观察tomcat6中的重要组件,比如standardserver,standardservice以及container如standardengine,standardhost,standardcontext,他们在start的时候都会发布这么几个事件:beforestartevent,startevent,afterstartevent). 于是在standardhost start的时候,触发事件,listeners作出响应,hostconfig的响应代码如下:
public void lifecycleEvent(LifecycleEvent event) {
if (event.getType().equals(Lifecycle.PERIODIC_EVENT))
check();
// Identify the host we are associated with
try {
host = (Host) event.getLifecycle();
if (host instanceof StandardHost) {
setDeployXML(((StandardHost) host).isDeployXML());
setUnpackWARs(((StandardHost) host).isUnpackWARs());
setXmlNamespaceAware(((StandardHost) host).getXmlNamespaceAware());
setXmlValidation(((StandardHost) host).getXmlValidation());
}
} catch (ClassCastException e) {
log.error(sm.getString("hostConfig.cce", event.getLifecycle()), e);
return;
}
// Process the event that has occurred
if (event.getType().equals(Lifecycle.START_EVENT))
start();
else if (event.getType().equals(Lifecycle.STOP_EVENT))
stop();
}
可以看出,如果触发的事件是START_EVENT,那么hostconfig调用自己的start方法。而正是在
start方法里面,调用deployApps来生成standardContext.
至此,不仅了解了tomcat中Lifecycle的Observer模式,而且了解了tomcat加载应用的流程。可谓一举两得。
分享到:
相关推荐
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
请选用适当的设计模式,编写一个股票行情分析软件,随着时间的推移和股票价格的变动,实现各种指标的动态更新(要求至少实现一个股票的分时图和K线图:为降低编程工作量,K线图可以用开盘价、收盘价、最高价、最低价...
源码分析方面,我们可以深入研究java.util.Observable和java.util.Observer的实现,了解如何通过这两个类实现观察者模式。同时,还可以探索其他编程语言中对观察者模式的支持,如C#的System.ComponentModel....
在C#中,虽然委托和事件提供了便利的实现方式,但通过GOF的经典方式也能实现同样的功能,这有助于理解模式的本质,并在不支持委托和事件的语言中应用Observer模式。在设计时,选择使用哪种实现方式取决于具体的需求...
本文将从 Tomcat 的工作原理、设计模式两个方面来分析 Tomcat 的系统架构。 一、Tomcat 的工作原理 Tomcat 的工作原理可以分为两个部分: Connector 组件和 Container 组件。 Connector 组件负责对外交流,主要...
A Linear Extended State Observer-based Fuzzy Fault-tolerant Controller for Autonomous Underwater Vehicle
这种模式在多线程、事件驱动、实时系统以及用户界面编程等领域有着广泛的应用。 在Observer模式中,主要有两个关键角色:Subject(主题)和Observer(观察者)。Subject维护了一个Observer的列表,并负责在状态变化...
设计模式是一种在软件设计中被广泛应用的通用解决方案模板,它总结了在特定上下文中解决常见问题的最佳实践。设计模式的概念起源于建筑行业,后来被引入到计算机科学,特别是在面向对象编程领域,成为提升代码可复用...
此外,文中还提到了其他设计模式在报表系统中的应用,如观察者(Observer)模式,用于实现模型和视图之间的实时同步,当模型数据发生变化时,观察者(视图)会收到通知并作出响应。适配器模式(Adapter)则帮助不同...
在这个压缩包文件"State-observer-for-nonlinear-systems.rar"中,我们关注的是非线性系统的观测器设计,特别是针对具有不确定性因素的非线性系统。 标题"State-observer-for-nonlinear-systems.rar_观测器_观测器...
3. Observer 模式:Observer 模式在 Tomcat 中主要应用于事件监听机制,例如 LifecycleEvent 事件,在 Server.xml 文件中,我们可以看到许多 Observer 的实现,例如 LifecycleListener、LifecycleEvent 等,这些 ...
安装从NPM: npm install resize-observer-polyfill --save-dev 从凉亭: (将在下一个主要版本中删除) bower install resize-observer-polyfill --save-dev浏览器支持Polyfill已在以下浏览器中经过测试: 注意
《设计模式之Observer》 设计模式是软件工程中的一种最佳实践,它们是在特定场景下解决常见问题的经验总结。Observer模式,又称为“观察者模式”...同时,结合源码分析,可以加深对设计模式本质的理解,提升编程技能。
### Observer与Command模式在VTK类库设计中的应用研究 #### 一、引言 VTK(Visualization Toolkit)是一套开源的三维可视化开发库,在国外得到了广泛应用,而在国内的研究相对较少,导致其应用受到一定限制。为了...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...
### resize-observer-polyfill源码分析 #### 1. ResizeObserver 类实现 `ResizeObserver` 类是 `resize-observer-polyfill` 的核心部分之一,它的主要职责是提供一个接口,让开发者能够通过该接口注册一个回调函数...
Vue调整大小观察器 English |安装Vue3.0 npm install --save vue-resize-observer@next Vue2.0 npm install --save vue-resize-observer 模块导入和示例导入软件包并将其安装到Vue中: const VueResizeObserver = ...
C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...