本文主要研究一下logback的ShutdownHook

ShutdownHook

ch/qos/logback/core/hook/ShutdownHook.java

/**
 * Interface describing a logback shutdown hook implementation
 * 
 * @author Mike Reinhold
 */
public interface ShutdownHook extends Runnable, ContextAware {
}
ShutdownHook接口继承了Runnable、ContextAware接口

ShutdownHookBase

ch/qos/logback/core/hook/ShutdownHookBase.java

/**
 * Base class for classes implementing a Logback ShutdownHook via extension
 *
 * @author Mike Reinhold
 */
public abstract class ShutdownHookBase extends ContextAwareBase implements ShutdownHook {

    public ShutdownHookBase() {
    }

    /**
     * Default method for stopping the Logback context
     */
    protected void stop() {
        addInfo("Logback context being closed via shutdown hook");

        Context hookContext = getContext();
        if (hookContext instanceof ContextBase) {
            ContextBase context = (ContextBase) hookContext;
            context.stop();
        }
    }
}
ShutdownHookBase继承了ContextAwareBase,声明实现ShutdownHook,它提供了一个stop方法,用于关闭ContextBase

DelayingShutdownHook

ch/qos/logback/core/hook/DelayingShutdownHook.java

/**
 * ShutdownHook implementation that stops the Logback context after a specified
 * delay.  The default delay is 0 ms (zero).
 *
 * @author Mike Reinhold
 */
public class DelayingShutdownHook extends ShutdownHookBase {
    /**
     * The default is no delay before shutdown.
     */
    public static final Duration DEFAULT_DELAY = Duration.buildByMilliseconds(0);

    /**
     * The delay in milliseconds before the ShutdownHook stops the logback context
     */
    private Duration delay = DEFAULT_DELAY;

    public DelayingShutdownHook() {
    }

    public Duration getDelay() {
        return delay;
    }

    /**
     * The duration to wait before shutting down the current logback context.
     *
     * @param delay
     */
    public void setDelay(Duration delay) {
        this.delay = delay;
    }

    public void run() {
        addInfo("Sleeping for "+delay);
        try {
            Thread.sleep(delay.getMilliseconds());
        } catch (InterruptedException e) {
        }
        super.stop();
    }
}
DelayingShutdownHook继承了ShutdownHookBase,其run方法先sleep指定的delay,然后执行stop方法

示例

<configuration debug="false">

    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
        <delay>10</delay>
    </shutdownHook>

    <appender name="A" class="ch.qos.logback.core.read.ListAppender"/>

    <root level="DEBUG">
        <appender-ref ref="A" />
    </root>

</configuration>

小结

logback的ShutdownHook接口继承了Runnable、ContextAware接口,它有一个抽象类ShutdownHookBase提供了一个stop方法,用于关闭ContextBase,它的子类为DelayingShutdownHook,可以延迟指定时间再关闭ContextBase。


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...