1. FileWatchdog 抽象类,它的子类在初始化时会调用checkAndConfigure方法,此方法记录文件最后修改时间并执行doOnChange方法读取文件。


2. FileWatchdog 又继承Thread,所以在线程启动后,每隔一段时间重新读取配置文件.


理解此原理继承、多态一定掌握哦


public abstract class FileWatchdog extends Thread

{

    /**

     * The default delay between every file modification check, set to 60

     * seconds.

     */

    static final public long DEFAULT_DELAY = 60000;

    /**

     * The name of the file to observe for changes.

     */

    protected String filename;

    /**

     * The delay to observe between every check. By default set

     * {@link #DEFAULT_DELAY}.

     */

    protected long delay = DEFAULT_DELAY;

    File file;

    long lastModif = 0;

    boolean warnedAlready = false;

    boolean interrupted = false;

    protected FileWatchdog(String filename)

    {

        super("FileWatchdog");

        this.filename = filename;

        file = new File(filename);

        setDaemon(true);

        checkAndConfigure();

    }

    /**

     * Set the delay to observe between each check of the file changes.

     */

    public void setDelay(long delay)

    {

        this.delay = delay;

    }

    abstract protected void doOnChange();

    protected void checkAndConfigure()

    {

        boolean fileExists;

        try

        {

            fileExists = file.exists();

        }

        catch (SecurityException e)

        {

            LogLog.warn("Was not allowed to read check file existance, file:[" + filename + "].");

            interrupted = true; // there is no point in continuing

            return;

        }

        if (fileExists)

        {

            long l = file.lastModified(); // this can also throw a

            // SecurityException

            if (l > lastModif)

            {

                // however, if we reached this point this

                lastModif = l; // is very unlikely.

                doOnChange();

                warnedAlready = false;

            }

        }

        else

        {

            if (!warnedAlready)

            {

                LogLog.debug("[" + filename + "] does not exist.");

                warnedAlready = true;

            }

        }

    }


    public void run()

    {

        while (!interrupted)

        {

            try

            {

                Thread.sleep(delay);

            }

            catch (InterruptedException e)

            {

                // no interruption expected

            }

            checkAndConfigure();

        }

    }

}

关注【Java技术堂】


原理分享-动态加载log4j.xml_java原理分享-动态加载log4j.xml_java_02