zoukankan      html  css  js  c++  java
  • Tomcat中组件的生命周期管理公共接口Lifecycle

    Tomcat的组件都会实现一个Lifecycle接口,以方便组件的生命周期的统一管理

    interface Lifecycle

    组件生命周期中主要的几个方法

    增加监听器,事件委托机制
    public void addLifecycleListener(LifecycleListener listener); public void removeLifecycleListener(LifecycleListener listener); 组件初始化 public void init() throws LifecycleException; public void start() throws LifecycleException; 组件停止,当stop()方法执行完后会自动调用destroy()方法销毁组件 public void stop() throws LifecycleException; public void destroy() throws LifecycleException; public LifecycleState getState();

    事件有:

    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";

    在tomcat启动过程中用到的几个组件,如StandardServer,StandardService,StandardEngine,StandardThreadExecutor,Connector等组件都间接实现了Lifecycle接口

    如StandardServer

    ==>public final class StandardServer extends LifecycleMBeanBase implements Server

    继承LifecycleMBeanBase

    ==>实现Server接口----不讨论

    ===>

    public abstract class LifecycleMBeanBase extends LifecycleBase
    implements JmxEnabled

    ===>public abstract class LifecycleBase implements Lifecycle

    当调用StandardServer.init()方法时会调用Lifecycle.init()方法,

    又因Lifecycle是接口,所以调用LifecycleBase这个接口的实现类LifecycleBase.init()

    这个方法内部调用的LifecycleBase.initInternal()

    在LifecycleBase中定义如下,就是一个抽象方法。需要继承这个类的所有组件实现这个方法。

    protected abstract void initInternal() throws LifecycleException;

    ==》在LifecycleBase的子类中LifecycleMBeanBase中重写的这个initInternal()

    进行组件注册到MBeanServer组件管理服务器中,这里是所有组件进行初始化动作时的操作,最后还是要到StandardServer的initInternal()方法具体实现。

    @Override
        protected void initInternal() throws LifecycleException {
    
            // If oname is not null then registration has already happened via
            // preRegister().
            if (oname == null) {
                mserver = Registry.getRegistry(null, null).getMBeanServer();
    
                oname = register(this, getObjectNameKeyProperties());
            }
        }

    ==》最后到StandardServer.initInternal()


    上面的流程化简下:

    StandardServer.init()
    
    =>Lifecycle.init()
    
    =>LifecycleBase.init()
    
    =>LifecycleBase.initInternal()
    
    =>LifecycleMBeanBase.initInternal()
    
    =>StandardServer.initInternal()

    StandardServer.init()最终调用的是StandardServer.initInternal()

    同理,由上面的过程可以知道我们调用组件的start(),stop(),destroy()方法时最后调用的是组件的

    startInternal(),stopInternal(),destroyInternal()方法。

    也不清楚这是什么设计模式,当感觉这个组件生命周期管理方法值得学习

  • 相关阅读:
    JAVA设计模式之桥接模式
    Pycharm新建模板默认添加作者时间等信息
    Handler机制(2)转载
    内部类学习
    设计模式-1依赖倒置原则示例
    正则表达式
    Service原理及例子
    Serializable接口
    设计模式之静态工厂模式
    Handler机制post方法使用
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/7797236.html
Copyright © 2011-2022 走看看