lifecycle.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 731 行

JAVA
731
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.lifecycle;import com.caucho.util.Alarm;import java.lang.ref.WeakReference;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;/** * Lifecycle class. */public final class Lifecycle implements LifecycleState {  private final Logger _log;  private String _name;    private Level _level = Level.FINE;  private Level _lowLevel = Level.FINER;    private int _state;  private long _activeCount;  private long _failCount;  private long _lastFailTime;  private long _lastChangeTime;  private ArrayList<WeakReference<LifecycleListener>> _listeners;  /**   * Creates an anonymous lifecycle.   */  public Lifecycle()  {    _log = null;  }  /**   * Creates an lifecycle with logger and name.   */  public Lifecycle(Logger log)  {    _log = log;  }  /**   * Creates an lifecycle with logger and name.   */  public Lifecycle(Logger log, String name)  {    _log = log;    _name = name;  }  /**   * Creates an lifecycle with logger,  a name, and a level.   */  public Lifecycle(Logger log, String name, Level level)  {    _log = log;    _name = name;        setLevel(level);  }  /**   * Gets the lifecycle name.   */  public String getName()  {    return _name;  }  /**   * Sets the lifecycle name, and the level to Level.INFO.   */  public void setName(String name)  {    _name = name;  }  /**   * Gets the lifecycle logging level.   */  public Level getLevel()  {    return _level;  }  /**   * Sets the lifecycle logging level.   */  public void setLevel(Level level)  {    _level = level;    if (level.intValue() < _lowLevel.intValue())      _lowLevel = level;  }  /**   * Adds a listener to detect lifecycle changes.   */  public void addListener(LifecycleListener listener)  {    synchronized (this) {      if (isDestroyed()) {        IllegalStateException e = new IllegalStateException("attempted to add listener to a destroyed lifecyle " + this);        if (_log != null)          _log.log(Level.WARNING, e.toString(), e);        else          Logger.getLogger(Lifecycle.class.getName()).log(Level.WARNING, e.toString(), e);        return;      }      if (_listeners == null)        _listeners = new ArrayList<WeakReference<LifecycleListener>>();      for (int i = _listeners.size() - 1; i >= 0; i--) {        LifecycleListener oldListener = _listeners.get(i).get();        if (listener == oldListener)          return;        else if (oldListener == null)          _listeners.remove(i);      }      _listeners.add(new WeakReference<LifecycleListener>(listener));    }  }  /**   * Removes a listener.   */  public void removeListener(LifecycleListener listener)  {    synchronized (this) {      if (_listeners == null)        return;      for (int i = _listeners.size() - 1; i >= 0; i--) {        LifecycleListener oldListener = _listeners.get(i).get();        if (listener == oldListener) {          _listeners.remove(i);          return;        }        else if (oldListener == null)          _listeners.remove(i);      }    }  }  /**   * Returns the listeners.   */  private void notifyListeners(int oldState, int newState)  {    synchronized (this) {      if (_listeners == null) {        return;      }      else {        for (int i = 0; i < _listeners.size(); i++) {          LifecycleListener listener = _listeners.get(i).get();          if (listener != null) {            listener.lifecycleEvent(oldState, newState);          }          else {            _listeners.remove(i);            i--;          }        }      }    }  }  /**   * Returns the current state.   */  public int getState()  {    return _state;  }  /**   * Returns the state name for the passed state.   */  public static String getStateName(int state)  {    switch (state) {      case IS_NEW:        return "new";      case IS_INITIALIZING:        return "initializing";      case IS_INIT:        return "init";      case IS_STARTING:        return "starting";      case IS_ACTIVE:        return "active";      case IS_FAILED:        return "failed";      case IS_STOPPING:        return "stopping";      case IS_STOPPED:        return "stopped";      case IS_DESTROYING:        return "destroying";      case IS_DESTROYED:        return "destroyed";      default:        return "unknown";    }  }  /**   * Returns the current state name.   */  public String getStateName()  {    return getStateName(_state);  }  /**   * Returns the last lifecycle change time.   */  public long getLastChangeTime()  {    return _lastChangeTime;  }  /**   * Returns the last failure time.   */  public long getLastFailTime()  {    return _lastFailTime;  }  /**   * Returns the number of times the lifecycle has switched to active.   */  public long getActiveCount()  {    return _activeCount;  }  /**   * Returns the number of times the lifecycle has switched to failing.   */  public long getFailCount()  {    return _failCount;  }  /**   * Returns true for the initializing state.   */  public boolean isInitializing()  {    return _state == IS_INITIALIZING;  }  /**   * Returns true for the init state.   */  public boolean isInit()  {    return _state == IS_INIT;  }  /**   * Returns true for the init state.   */  public boolean isBeforeInit()  {    return _state < IS_INIT;  }  /**   * Returns true for the init state.   */  public boolean isAfterInit()  {    return _state >= IS_INIT;  }  /**   * Returns true if the service is starting.   */  public boolean isStarting()  {    return _state == IS_STARTING;  }  /**   * Returns true for the warmup state.   */  public boolean isWarmup()  {    return _state == IS_WARMUP;  }  /**   * Returns true for the initializing state.   */  public boolean isBeforeActive()  {    return _state < IS_ACTIVE;  }  /**   * Returns true for the closing states   */  public boolean isAfterActive()  {    return IS_ACTIVE < _state;  }  /**   * Wait for a period of time until the service starts.   */  public boolean waitForActive(long timeout)  {    if (_state == IS_ACTIVE)      return true;        long waitEnd = Alarm.getCurrentTime() + timeout;        synchronized (this) {      while (Alarm.getCurrentTime() < waitEnd) {	if (_state == IS_ACTIVE)	  return true;	else if (IS_ACTIVE < _state)	  return false;	else if (Alarm.isTest())	  return false;	try {	  wait(waitEnd - Alarm.getCurrentTime());	} catch (InterruptedException e) {	}      }    }        return _state == IS_ACTIVE;  }  /**   * Returns true for the active state.   */  public boolean isActive()  {    return _state == IS_ACTIVE;  }  /**   * Returns true for the a runnable state, including warmup   */  public boolean isRunnable()  {    return IS_WARMUP <= _state && _state <= IS_ACTIVE;  }  /**   * Returns true for the failed state.   */  public boolean isError()  {    return isFailed();  }  /**   * Returns true for the failed state.   */  public boolean isFailed()  {    return _state == IS_FAILED;  }  /**   * Returns true if the state is stopping.   */  public boolean isStopping()  {    return IS_STOPPING <= _state;  }  /**   * Returns true if the state is stopping.   */  public boolean isStopped()  {    return IS_STOPPING <= _state;  }  /**   * Returns true if the state is closed   */  public boolean isDestroying()  {    return IS_DESTROYING <= _state;  }  /**   * Returns true if the state is closed   */  public boolean isDestroyed()  {    return IS_DESTROYED <= _state;  }    /**   * Changes to the initializing state.   *   * @return true if the transition is allowed   */  public synchronized boolean toInitializing()  {    if (IS_INITIALIZING <= _state)      return false;    int oldState = _state;    _state = IS_INITIALIZING;    _lastChangeTime = Alarm.getCurrentTime();    if (_log != null && _log.isLoggable(_lowLevel))      _log.log(_lowLevel, _name + " initializing");    notifyListeners(oldState, _state);    return true;  }  /**    * Changes to the init state.    *    * @return true if the transition is allowed    */   public synchronized boolean toInit()   {     if (IS_INIT <= _state)       return false;     int oldState = _state;     _state = IS_INIT;     _lastChangeTime = Alarm.getCurrentTime();     if (_log != null && _log.isLoggable(_lowLevel))       _log.log(_lowLevel, _name + " initialized");     notifyListeners(oldState, _state);     return true;   }  /**    * Changes to the init from the stopped state.    *    * @return true if the transition is allowed    */   public synchronized boolean toPostInit()   {     if (IS_STOPPED == _state) {       int oldState = _state;       _state = IS_INIT;       _lastChangeTime = Alarm.getCurrentTime();       notifyListeners(oldState, _state);       return true;     }     else if (IS_INIT == _state) {       return true;     }     return false;   }  /**   * Changes to the starting state.   *   * @return true if the transition is allowed   */  public synchronized boolean toStarting()  {    if (_state < IS_STARTING || _state == IS_STOPPED) {      int oldState = _state;      _state = IS_STARTING;       _lastChangeTime = Alarm.getCurrentTime();             if (_log != null && _log.isLoggable(Level.FINE)	  && _log.isLoggable(_level))	_log.fine(_name + " starting");      notifyListeners(oldState, _state);      return true;    }    else      return false;  }    /**   * Changes to the active state.   *   * @return true if the transition is allowed   */  public synchronized boolean toActive()  {    if (_state < IS_ACTIVE || IS_FAILED <= _state && _state <= IS_STOPPED) {      int oldState = _state;      _state = IS_ACTIVE;      _lastChangeTime = Alarm.getCurrentTime();      _activeCount++;      if (_log != null && _log.isLoggable(_level))	_log.log(_level, _name + " active");      notifyListeners(oldState, _state);      notifyAll();      return true;    }    else      return false;  }    /**   * Changes to the error state.   *   * @return true if the transition is allowed   */  public boolean toError()  {    return toFail();  }    /**   * Changes to the failed state.   *   * @return true if the transition is allowed   */  public synchronized boolean toFail()  {    if (_state < IS_DESTROYING && _state != IS_FAILED) {      int oldState = _state;      _state = IS_FAILED;      _lastChangeTime = Alarm.getCurrentTime();      _failCount++;      if (_log != null && _log.isLoggable(_level))	_log.log(_level, _name + " error");      notifyListeners(oldState, _state);      notifyAll();      return true;    }    else      return false;  }    /**   * Changes to the stopping state.   *   * @return true if the transition is allowed   */  public synchronized boolean toStopping()  {    if (_state < IS_STOPPING && _state != IS_STARTING) {      int oldState = _state;      _state = IS_STOPPING;      _lastChangeTime = Alarm.getCurrentTime();      if (_log != null && _log.isLoggable(_level))	_log.log(_level, _name + " stopping");      notifyListeners(oldState, _state);      return true;    }    else      return false;  }    /**   * Changes to the stopped state.   *   * @return true if the transition is allowed   */  public synchronized boolean toStop()  {    if (_state < IS_STOPPED) {      if (_log == null) {      }      else if (_state < IS_STOPPING && _log.isLoggable(_level))	_log.log(_level, _name + " stopped");      else if (_log.isLoggable(_lowLevel))	_log.log(_lowLevel, _name + " stopped");            int oldState = _state;      _state = IS_STOPPED;      _lastChangeTime = Alarm.getCurrentTime();      notifyListeners(oldState, _state);      notifyAll();      return true;    }    else      return false;  }    /**   * Changes to the destroying state.   *   * @return true if the transition is allowed   */  public synchronized boolean toDestroying()  {    if (_state < IS_DESTROYING) {      int oldState = _state;      _state = IS_DESTROYING;      _lastChangeTime = Alarm.getCurrentTime();      if (_log != null && _log.isLoggable(_lowLevel))	_log.log(_lowLevel, _name + " destroying");      notifyListeners(oldState, _state);      return true;    }    else      return false;  }    /**   * Changes to the closed state.   *   * @return true if the transition is allowed   */  public synchronized boolean toDestroy()  {    if (_state < IS_DESTROYED) {      int oldState = _state;      _state = IS_DESTROYED;      _lastChangeTime = Alarm.getCurrentTime();      if (_log != null && _log.isLoggable(_lowLevel))	_log.log(_lowLevel, _name + " destroyed");      notifyListeners(oldState, _state);      notifyAll();      return true;    }    else      return false;  }    /**   * Copies from a target state.   *   * @return true if the transition is allowed   */  public void copyState(Lifecycle source)  {    _state = source._state;  }  /**   * Debug string value.   */  public String toString()  {    if (_name != null)      return "Lifecycle[" + _name + ", " + getStateName() + "]";    else      return "Lifecycle[" + getStateName() + "]";  }}

⌨️ 快捷键说明

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