引言在上一篇文章中,我们看到了Tomcat架构的核心组件,每个组件都有自己的角色,每个组件之间都有对应的父子关系。那么如何处理这些对象的创建、调用、销毁等操作呢?
即Tomcat中组件的对象生命周期是如何管理的?为了解决这个问题,Tomcat中设计了生命周期接口来管理Tomcat中核心组件的生命周期,因此本文系统地介绍了生命周期接口的设计。
1.生命周期接口设计为了统一管理Tomcat中核心组件的生命周期,专门设计了生命周期接口进行统一管理。让我们看看在生命周期接口中声明了什么。
1.1生命周期方法在生命周期中,声明了生命周期相关的方法,包括init()、start()、stop()、destroy()等。
在声明的方法执行过程中,会涉及到相应的状态转换,这在生命周期接口的头文件中有明确的说明。
1.2相关状态处理通过上图,我们可以清楚地看到相关方法执行中涉及到的相关状态转换。比如init()会从新状态开始,然后进入INITIALIZING和INITIALIZED等。因为这一块涉及到相应的状态转换,相关状态和事件的生命周期字符串在生命周期中声明。
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 ";公共静态最终字符串AFTER _ STOP _ EVENT = " after _ stoppublic static final String AFTER _ DESTROY _ EVENT = " AFTER _ DESTROY ";public static final String BEFORE _ DESTROY _ EVENT = " BEFORE _ DESTROY ";/* * *周期事件的生命周期事件类型。*周期性事件(后台线程定期执行一些事情,比如热部署、热替换)*/public static final string Periodic _ event = " Periodic ";公共静态最终字符串CONFIGURE _ START _ EVENT = " CONFIGURE _ START ";公共静态最终字符串CONFIGURE _ STOP _ EVENT = " CONFIGURE _ STOP ";在LifecycleState中建立对应关系。
对于特定的事件,会有相关的监听器进行监听和处理。相关的处理方法在生命周期中定义。
public void addLifecycleListener(LifecycleListener侦听器);公共生命周期
3.1事件处理在上面的界面设计中,没有实现监控对应的事件处理。这个作品在LifecycleBase中得到了很好的实现。让我们来看看。首先,定义一个容器来存储所有侦听器。
//存储所有侦听器私有最终列表& lt生命周期斯坦纳& ampgt;新的CopyOnWriteArrayList & amplt;& ampgt;();同时提供了触发监控的相关方法,并绑定了相应的事件。
/* * *允许子类触发{@ linklifecycle}事件。*侦听器触发相关事件* @param type事件类型事件类型* @param data与事件关联的数据。*/protected void fireLifecycleEvent(字符串类型,对象数据){ LifecycleEvent event = new LifecycleEvent(this,type,data);for(LifecycleListener listener:lifecycleListeners){ listener . lifecycleevent(event);}}}针对的是监听器相关的处理方法。
//Add listener @ override public void addlifecyclelistener(生命周期监听器监听器){ lifecycle listeners.add(监听器);}//查找所有侦听器并将其转换为数组类型@ override public life cycle listeners[]findlifecyclelisteners(){ return life cycle listeners . to array(newlifecycle listener[0]);}//Remove a listener @ override public void removelifecyclelistener(生命周期监听器监听器){ lifecycle listeners.remove(监听器);}
3.2生命周期法LifecycleBase的核心是在生命周期中实现生命周期法。我们以init方法为例。
/* * *实现Lifecycle中定义的init方法*该方法与对应组件的状态之间的关联* @ ThrowsLifeCycle Exception */@ Override public final synchronized void init()ThrowsLifeCycle Exception { if(!状态;equals(life cycle estate;New)) {//Invalid operation只有处于新状态的才能调用init方法进入初始化无效转换(lifecycle之前_初始化_事件);} try {//将状态设置为正在初始化....同步将触发相应的事件SetState Internal(生命周期状态。Initializing,null,false);initInternal();//将具体的实现初始化操作交给子类。//更新状态是初始化完成。同步将触发相应的事件SetState Internal(life cycle estate。initialized,null,false);} catch(Throwable t){ handlesubclass exception(t," lifecycleBase.initFail ",toString());}}源代码分析:
我们将首先确定当前对象的状态是否是新的,因为init方法只能在新的状态下初始化。如果满足1条件,则state的状态将更新为INITIALIZED,并触发此事件。然后initInternale()方法会交给子类来实现,子类处理完后状态会更新为initialized。我们可以输入setStateInternal方法来查看最终的关键代码:
// ....this.state = state//更新状态//根据状态与事件的绑定关系获取对应的事件字符串life cycle Event = state . Get life cycle Event();if (lifecycleEvent!= null) {//发布对应的事件FireLifeCycle Event(生命周期事件,数据);}你可以看到它与相应的事件相关联。把init方法的逻辑说清楚之后,你会发现start方法,stop方法,destory方法的处理逻辑都差不多,你可以自己看。
需要在核心组件(如服务器服务引擎连接器)中查看对应的initInternal()方法的逻辑。我们将带领大家结合Tomcat的启动过程来看这一点。
以上是Tomcat生命周期的详细内容。关于Tomcat生命周期的更多信息,请关注主机频道zhujipindao中的其他相关文章。com!
评论前必须登录!
注册