tomcat——生命周期管理机制

Catalina由多个组件组成,当Catalina启动的时候,这些组件也会启动。当Catalina停止的时候,这些组件也必须有机会被清除。保持组件启动和停止一致的机制通过实现org.apache.catalina.Lifecycle接口来实现

如果一个组件可以触发事件,那么必须存在相应的监听器来对触发的事件作出回应。

Tomcat的生命周期管理机制算是监听器模式的一种应用




Lifecycle接口

Catalina的设计允许一个组件包含其他的组件,一个父组件负责启动和停止其子组件。

public interface Lifecycle {
    /**
     * 添加生命周期监听器
     *
     * @param listener 添加的监听器
     */
    void addLifecycleListener(LifecycleListener listener);

    /**
     * 删除生命周期监听器
     *
     * @param listener 删除的监听器
     */
    void removeLifecycleListener(LifecycleListener listener);

    /**
     * 获取所有的生命周期监听器
     *
     * @return 所有的生命周期监听器
     */
    List<LifecycleListener> findListeners();

    /**
     * 启动组件
     *
     * @throws LifecycleException 启动失败
     */
    void start() throws LifecycleException;

    /**
     * 关闭组件
     *
     * @throws LifecycleException 关闭失败
     */
    void stop() throws LifecycleException;

}






LifecycleEvent:表示一个生命周期事件 ,继承EventObject

public final class LifecycleEvent extends EventObject {
    //事件类型
    private LifecycleEventType type;
    //事件关联的数据对象
    private Object data;
    
    private Lifecycle lifecycle;

    public LifecycleEvent(LifecycleEventType type, Lifecycle lifecycle) {
        this(type, null, lifecycle);
    }

    public LifecycleEvent(LifecycleEventType type, Object data, Lifecycle lifecycle) {
        super(lifecycle);
        this.type = type;
        this.data = data;
        this.lifecycle = lifecycle;
    }

    public LifecycleEventType getType() {
        return type;
    }

    public void setType(LifecycleEventType type) {
        this.type = type;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Lifecycle getLifecycle() {
        return lifecycle;
    }

    public void setLifecycle(Lifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }
}

生命周期事件类型:
public enum LifecycleEventType {
    //启动前事件
    BEFORE_START,
    //启动事件
    START,
    //启动后事件
    AFTER_START,
    BEFORE_STOP,
    STOP,
    AFTER_STOP;
}

自定义生命周期异常
public class LifecycleException extends RuntimeException {

    public LifecycleException() {
    }

    public LifecycleException(String message) {
        super(message);
    }

    public LifecycleException(String message, Throwable cause) {
        super(message, cause);
    }

    public LifecycleException(Throwable cause) {
        super(cause);
    }

    public LifecycleException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

监听器接口
public interface LifecycleListener {
    /**
     * 触发了生命周期事件
     *
     * @param event 触发的生命周期事件
     */
    void lifecycleEvent(LifecycleEvent event);

}

监听器实现
public class BeforeListener implements LifecycleListener {

    public void lifecycleEvent(LifecycleEvent event) {
        if (event.getType() == LifecycleEventType.BEFORE_START || event.getType() == LifecycleEventType.BEFORE_STOP) {
            System.out.println("BeforeListener");
        }
    }
}

LifecycleSupport : 统一实现触发事件和通知所有的listener

public final class LifecycleSupport {

    private Lifecycle lifecycle;

    private CopyOnWriteArrayList<LifecycleListener> listeners = new CopyOnWriteArrayList<LifecycleListener>();

    public LifecycleSupport(Lifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }

    public void addLifecycleListener(LifecycleListener listener) {
        listeners.add(listener);
    }

    public void removeLifecycleListener(LifecycleListener listener) {
        listeners.remove(listener);
    }

    public List<LifecycleListener> findListeners() {
        return listeners;
    }

    public void fireLifecycleEvent(LifecycleEvent event) {
        for (LifecycleListener listener : listeners) {
            listener.lifecycleEvent(event);
        }
    }

}


组件——实现Lifecycle接口,负责触发生命周期事件

public class Component implements Lifecycle {

    private LifecycleSupport lifecycleSupport = new LifecycleSupport(this);

    public void addLifecycleListener(LifecycleListener listener) {
        lifecycleSupport.addLifecycleListener(listener);
    }

    public void removeLifecycleListener(LifecycleListener listener) {
        lifecycleSupport.removeLifecycleListener(listener);
    }

    public List<LifecycleListener> findListeners() {
        return lifecycleSupport.findListeners();
    }

    public void start() throws LifecycleException {
        LifecycleEvent event = new LifecycleEvent(LifecycleEventType.BEFORE_START, this);
        lifecycleSupport.fireLifecycleEvent(event);
        event = new LifecycleEvent(LifecycleEventType.START, this);
        lifecycleSupport.fireLifecycleEvent(event);
        event = new LifecycleEvent(LifecycleEventType.AFTER_STOP, this);
        lifecycleSupport.fireLifecycleEvent(event);
    }

    public void stop() throws LifecycleException {
        LifecycleEvent event = new LifecycleEvent(LifecycleEventType.BEFORE_STOP, this);
        lifecycleSupport.fireLifecycleEvent(event);
        event = new LifecycleEvent(LifecycleEventType.STOP, this);
        lifecycleSupport.fireLifecycleEvent(event);
        event = new LifecycleEvent(LifecycleEventType.AFTER_STOP, this);
        lifecycleSupport.fireLifecycleEvent(event);
    }
}



测试类

public class TestLifecycle {

    public static void main(String[] args) {
        Component component = new Component();
        component.addLifecycleListener(new BeforeListener());
        if (component instanceof Lifecycle) {
            component.start();
            component.stop();
        }
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值