jasenautoupdatereaper.java

来自「spam source codejasen-0.9jASEN - java An」· Java 代码 · 共 172 行

JAVA
172
字号
/*
 * @(#)JasenAutoUpdateReaper.java	7/01/2005
 *
 * Copyright (c) 2005 jASEN.org
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in
 *      the documentation and/or other materials provided with the distribution.
 *
 *   3. The names of the authors may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 *   4. Any modification or additions to the software must be contributed back
 *      to the project.
 *
 *   5. Any investigation or reverse engineering of source code or binary to
 *      enable emails to bypass the filters, and hence inflict spam and or viruses
 *      onto users who use or do not use jASEN could subject the perpetrator to
 *      criminal and or civil liability.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JASEN.ORG,
 * OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
package org.jasen.update;

import org.apache.log4j.Logger;
import org.jasen.thread.StoppableThread;

/**
 * <p>
 * The reaper monitors the auto updater thread and will kill it if it thinks it's stuck in an update cycle.
 * </p>
 * <p>
 * The auto updater may deadlock if it cannot receive data from the update site, or (more likely) the update
 * contains an executor (AutoUpdateExecutor) which has not exited
 * </p>
 * @see org.jasen.interfaces.AutoUpdateExecutor
 * @author Jason Polites
 */
public class JasenAutoUpdateReaper extends StoppableThread {

    static final Logger logger = Logger.getLogger(JasenAutoUpdateReaper.class);

    private JasenAutoUpdater updater;
    private JasenAutoUpdateManager manager;

    private boolean running;
    private long timeout = 120000L; // 2 minutes
    public static long killTimeout = 10000L; // 10 seconds


    /**
     *
     */
    public JasenAutoUpdateReaper(JasenAutoUpdater updater, JasenAutoUpdateManager manager) {
        super();
        this.updater = updater;
        this.manager = manager;
    }

    /**
     * @param name
     */
    public JasenAutoUpdateReaper(JasenAutoUpdater updater, JasenAutoUpdateManager manager, String name) {
        super(name);
        this.updater = updater;
        this.manager = manager;
    }

    public void run () {
        running = true;

        long currentTime;
        long lastTime = -1L;

        while(running) {


            synchronized (this) {

                currentTime = System.currentTimeMillis();

                if(!updater.isIdle()) {
                    // The updater is running, check the time...
                    if(lastTime < 0) {
                        // First non-idle report, just record the time
                        lastTime = currentTime;
                    }
                    else
                    {
                        // We have been idle before...
                        if(currentTime - lastTime >= timeout) {
                            // We have to kill the updater and restart it...
                            restartAutoUpdater();
                        }

                        lastTime = currentTime;
                    }
                }
                else
                {
                    // reset
                    lastTime = -1L;
                }

                if(running) {
                    try {
                        // Wait until notified or we loop again
                        wait(timeout);
                    }
                    catch (InterruptedException ignore) {}
                }
            }
        }
    }

    /**
     * Stops the reaper.
     */
    public synchronized void finish() {
        running = false;
        notifyAll();
    }

    /**
     * Force kills the updater and starts it again...
     */
    void restartAutoUpdater() {

        logger.warn("Reaper is restarting auto updater");

        // Request a finish
        updater.finish();

        try {
            updater.join(killTimeout);
        } catch (InterruptedException ignore) {}

        if(updater.isAlive()) {
            // Kill it!
            updater.interrupt();
        }

        // Make sure we notify any waiting scans
        if(manager.isUpdating()) {
            JasenAutoUpdateReport report = new JasenAutoUpdateReport();
            report.setUpdateAborted(true);
            manager.notifyUpdateComplete(report);
        }

        // And restart
        updater = new JasenAutoUpdater(manager, updater.getName());
        updater.start();
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?