Tomcat源码分析(7)启动 关闭机制(生命周期).doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:6 大小:33KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Tomcat源码分析(7)启动 关闭机制(生命周期).doc

Tomcat源码分析(7)启动关闭机制(生命周期).doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

智慧人大有能力诚信・正直・创新有知识的人力上加力HansonTel:15360452825.Mail:hansonjan@163.comTomcat源码分析(七)--单一启动/关闭机制(生命周期)在前面的大部分文章都是讲连接器和容器的,以后的内容会偏向写一些Tomcat的其他组件以及一些细节的东西。Tomcat有很多组件,要一个一个启动组件难免有点麻烦。由于Tomcat的包含关系是Catalina->Server->Service->容器/连接器/日志器等,于是可通过父组件负责启动/关闭它的子组件,这样只要启动Catalina,其他的都自动启动了。这种单一启动和关闭的机制是通过实现Lifecycle接口来实现的。下面是Lifecycle接口的定义:[java]publicinterfaceLifecycle{publicstaticfinalStringSTART_EVENT="start";//生命周期的六个事件类型!publicstaticfinalStringBEFORE_START_EVENT="before_start";publicstaticfinalStringAFTER_START_EVENT="after_start";publicstaticfinalStringSTOP_EVENT="stop";publicstaticfinalStringBEFORE_STOP_EVENT="before_stop";publicstaticfinalStringAFTER_STOP_EVENT="after_stop";publicvoidaddLifecycleListener(LifecycleListenerlistener);//在此组件中添加一个监听器publicLifecycleListener[]findLifecycleListeners();publicvoidremoveLifecycleListener(LifecycleListenerlistener);publicvoidstart()throwsLifecycleException;//组件启动方法publicvoidstop()throwsLifecycleException;}当组件实现了Lifecycle接口,父组件启动的时候,即调用start方法时,只要在父组件的start方法中也调用子组件的start方法即可(只有实现统一的接口Lifecycle才能实现统一调用,如以下调用方式:(Lifecycle)子组件.start()),下面一步一步来看源代码,首先在Catalina启动start,部分代码如下:[java]//Startthenewserverif(serverinstanceofLifecycle){try{server.initialize();((Lifecycle)server).start();//启动servertry{//RegistershutdownhookRuntime.getRuntime().addShutdownHook(shutdownHook);}catch(Throwablet){//ThiswillfailonJDK1.2.Ignoring,asTomcatcanrun//finewithouttheshutdownhook.}//Waitfortheservertobetoldtoshutdownserver.await();}catch(LifecycleExceptione){System.out.println("Catalina.start:"+e);e.printStackTrace(System.out);if(e.getThrowable()!=null){System.out.println("-----RootCause-----");e.getThrowable().printStackTrace(System.out);}}}关键看((Lifecycle)server).start();这样便在启动Catalina的时候启动了Server,再看StandardServer的start方法:[java]publicvoidstart()throwsLifecycleException{//Validateandupdateourcurrentcomponentstateif(started)thrownewLifecycleException(sm.getString("standardServer.start.started"));//NotifyourinterestedLifecycleListeners//发送这个事件lifecycle.fireL