《how tomcat work》 搬运工 Chapter 6:Lifecycle & Chapter 7:Logger &Chapter 8: Loader

Chapter 6

在tomcat 中有很多的组件,这些组件会启动,会在关闭的时候做一些清除的工作,所以就需要Lifecycle这个组件来扩展。

Lifecycle主要包括三部分

1、The Lifecycle Interface

要使用lifecycle的组件,需要实现这个接口,这样就可以开启或关闭lifecycle,以及lifecycleListener的添加和修改与查找

public interface Lifecycle { 
    public static final String START_EVENT = "start"; 
    public static final String BEFORE_START_EVENT = "before_start";  
    public static final String AFTER_START_EVENT = "after_start"; 
    public static final String STOP_EVENT = "stop"; 
    public static final String BEFORE_STOP_EVENT = "before_stop";
    public static final String AFTER_STOP_EVENT = "after_stop"; 
    public void addLifecycleListener(LifecycleListener listener); 
    public LifecycleListener[] findLifecycleListeners(); 
    public void removeLifecycleListener(LifecycleListener listener); 
    public void start() throws LifecycleException; 
    public void stop() throws LifecycleException; 
}

 

2、The LifecycleListener Interface 和 LifecycleEvent

LifecycleListener就是出来事件的,把event传进来然后处理

 

public final class LifecycleEvent extends EventObject { 
    public LifecycleEvent(Lifecycle lifecycle, String type) { 
    this(lifecycle, type, null); 
} 
    public LifecycleEvent(Lifecycle lifecycle, String type, Object data) {
    super(lifecycle);
    this.lifecycle = lifecycle;
     this.type = type; this.data = data; 
    } 
    private Object data = null; 
    private Lifecycle lifecycle = null; 
    private String type = null; 
    public Object getData() { 
        return (this.data); 
    } 
    public Lifecycle getLifecycle() { 
        return (this.lifecycle); 
    }
    public String getType() { 
        return (this.type); 
    } 
}    

 

 

 

 

public interface LifecycleListener { 
    public void lifecycleEvent(LifecycleEvent event); 
}

 

 

3、The LifecycleSupport Class

Catalina为实现了Lifecycle的组件能够更加简单实现Lifecycle,就弄出了这个类,这个就将添加LifecycleListener,删除LifecycleListener,存储LifecycleListener,还有启动事件的函数都实现了

public final class LifecycleSupport { 
    public LifecycleSupport(Lifecycle lifecycle) 
    { 
        super(); 
        this.lifecycle = lifecycle; 
    } 
    private Lifecycle lifecycle = null; 
    private LifecycleListener listeners[] = new LifecycleListener[0]; 
    public void addLifecycleListener(LifecycleListener listener) { 
        synchronized (listeners) { 
            LifecycleListener results[] = new LifecycleListener[listeners.length + 1]; 
            for (int i = 0; i < listeners.length; i++) 
            results[i] = listeners[i]; 
            results[listeners.length] = listener; 
            listeners = results; 
        } 
    } 
    public LifecycleListener[] findLifecycleListeners() { 
        return listeners; 
    } 
    public void fireLifecycleEvent(String type, Object data) {
        LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); 
        LifecycleListener interested[] = null; 
        synchronized (listeners) {
             interested = (LifecycleListener[]) listeners.clone(); 
        } 
        for (int i = 0; i < interested.length; i++)
            interested[i].lifecycleEvent(event); 
        } 
    public void removeLifecycleListener(LifecycleListener listener) { 
        synchronized (listeners) { 
            int n = -1; 
            for (int i = 0; i < listeners.length; i++) { 
                if (listeners[i] == listener) { 
                    n = i; 
                    break; 
                } 
            } 
            if (n < 0) return; 
            LifecycleListener results[] = new LifecycleListener[listeners.length - 1];
            int j = 0; 
            for (int i = 0; i < listeners.length; i++) { 
                if(i != n) results[j++] = listeners[i]; 
            } 
            listeners = results; 
        } 
    } 
}    

 

 

在container中的实际用法

首先在context中implements Lifecycle,再添加一个LifecycleSupport的实例lifecycle,和一个addLifecycleListener方法添加LifecycleListener,当然还有其他方法

public class SimpleContext implements Context, Pipeline, Lifecycle {
    ...
    ...
    ...
    protected LifecycleSupport lifecycle = new LifecycleSupport(this);
    ...
    ...

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


}

 

下面的方法是simpleContext的start()方法,通过start()来触发lifecycle的lifecycleListener,还有包括loader,context 的children的start()

public synchronized void start() throws LifecycleException {
    if (started)
      throw new LifecycleException("SimpleContext has already started");

    // Notify our interested LifecycleListeners
    lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
    started = true;
    try {
      // Start our subordinate components, if any
      if ((loader != null) && (loader instanceof Lifecycle))
        ((Lifecycle) loader).start();

      // Start our child containers, if any
      Container children[] = findChildren();
      for (int i = 0; i < children.length; i++) {
        if (children[i] instanceof Lifecycle)
          ((Lifecycle) children[i]).start();
      }

      // Start the Valves in our pipeline (including the basic),
      // if any
      if (pipeline instanceof Lifecycle)
        ((Lifecycle) pipeline).start();
      // Notify our interested LifecycleListeners
      lifecycle.fireLifecycleEvent(START_EVENT, null);
    }
    catch (Exception e) {
      e.printStackTrace();
    }

    // Notify our interested LifecycleListeners
    lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
  }

 

Chapter 7:Logger

Logger就负责了日志的记录,在how tomcat work里介绍了很多,真正用到的地方是

System.setProperty("catalina.base", System.getProperty("user.dir")); 
FileLogger logger = new FileLogger(); 
logger.setPrefix("FileLog_"); 
logger.setSuffix(".txt"); 
logger.setTimestamp(true); 
logger.setDirectory("webroot"); 
context.setLogger(logger);

 

Chapter 8: Loader

Loader是java中一个重要的组成部分。

在Tomcat中,来加载类的是WebappLoader Class。

这个能控制好类的加载权限,和缓存加载成功的类,以及缓存加载失败的类。

    // here is our loader
    Loader loader = new WebappLoader();
    // associate the loader with the Context
    context.setLoader(loader);

 

posted @ 2015-08-23 18:24  Xuyung  阅读(160)  评论(0编辑  收藏  举报