Tomcat組件的生命週期Lifecycle

Tomcat中有很多組件,Tomcat啓動的時候這些組件就會啓動,當Tomcat關閉的時候這些組件就會關閉.

實現Lifecycle接口的最賤可以觸發下面這些LifecycleEvent:START_EVENT, BEFORE_START_EVENT, AFTER_START_EVENT, STOP_EVENT, BEFORE_STOP_EVENT, AFTER_STOP_EVENT.


當實現Lifecycle接口的組件觸發上述的事件的時候,會調用註冊在實現Lifecycle接口組件中的監聽器LifecycleListener.


上述的過程其實和我們Tomcat中的Servlet的監聽器很類似.可以說就是一個事件監聽模型.


下面我們挨個介紹使用到的幾個接口:

1.Lifecycle 事件源,發佈事件給監聽器,表示具有生命週期的組件

2.LifecyceEvent 事件, 表示Lifecycle觸發的事件,觸發的事件會通知監聽該Lifecycle的LifecycleListener.

3.LifecycleListener 事件監聽器,監聽Lifecycle組件, 當Liferay組件觸發某事件的時候, LifecycleListener 就會收到Lifecycle發送過來的 LifecyceEvent

4.LifecycleSupport 負責Lifecycle組件的事件管理工作

簡單的來說就是Lifecycle相當於一個新聞訂閱中心,LifecycleEvent相當於消息,LifecycleListener相當於訂閱者.當我們訂閱新聞(監聽器註冊在Lifecycle組件中),新聞訂閱中心有新動態發佈的時候,會把消息發送給訂閱者(.LifecycleListener)最新的動態(LifecyceEvent) 

1.Lifecycle


package weber.test.tomcat.lifecycle;

/**
 * 實現該接口,表示該接口具有Lifecycle生命週期,可以觸發以下的事件
 * 1.可以註冊監聽器,刪除監聽器 
 * 2.啓動調用start方法 停止調用stop方法
 *
 */
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();

	public void stop();

}
2.LifecyceEvent

package weber.test.tomcat.lifecycle;

import java.util.EventObject;

/**
 * 
 * Lifecycle組件促發事件發送LifecycleEvent給LifecycleListener
 * Event包含事件信息,事件源等
 *
 */
public final class LifecycleEvent extends EventObject {

	private static final long serialVersionUID = 1L;

	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);

	}

}


3.LifecycleListener

package weber.test.tomcat.lifecycle;

/**
 * 
 * 註冊到Lifecycle組件的監聽器, 當Lifecycle組件觸發事件的時候,會調用lifecycleEvent方法
 */
public interface LifecycleListener {

	public void lifecycleEvent(LifecycleEvent event);

}


4.LifecycleSupport

package weber.test.tomcat.lifecycle;

/**
 * 
 * 該類實際用來管理Lifecycle的事件,包括事件監聽器的註冊和刪除,觸發事件
 * 一般來說,我們直接在Lifecycle的實例中使用一個LifecycleSupport實例來實現這個效果.
 * 詳細請看LifecycleComponent的代碼
 *
 */
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;
		}

	}

}

測試代碼

1.LifecycleComponent 實現Lifecycle的組件

package weber.test.tomcat.lifecycle;

/**
 * 
 * 測試使用的實現Lifecycle的組件
 *
 */
public class LifecycleComponent implements Lifecycle {
	
	//相當於組件的事件監聽管理器
	private LifecycleSupport lifecycle = new LifecycleSupport(this);

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

	@Override
	public LifecycleListener[] findLifecycleListeners() {
		return lifecycle.findLifecycleListeners();
	}

	@Override
	public void removeLifecycleListener(LifecycleListener listener) {
		lifecycle.removeLifecycleListener(listener);
	}

	@Override
	public void start() {
		//啓動前觸發啓動前的事件
		lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
		System.out.println("LifecycleComponent start");
		lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
	}

	@Override
	public void stop() {
		lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);
		lifecycle.fireLifecycleEvent(STOP_EVENT, null);
		System.out.println("LifecycleComponent stop");
		lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null);
	}

}

2,SimpleLifecycleListener 實現LifecycleListener接口的事件監聽器

package weber.test.tomcat.lifecycle;

/**
 * 
 * 測試使用的簡單事件監聽器
 * 我們將使用它註冊到我們的測試Lifecycle組件中
 *
 */
public class SimpleLifecycleListener implements LifecycleListener {

	public void lifecycleEvent(LifecycleEvent event) {

		Lifecycle lifecycle = event.getLifecycle();
		System.out.println("SimpleLifecycleListener's event " + event.getType().toString());
		if (Lifecycle.START_EVENT.equals(event.getType())) {
			System.out.println("Starting .");
		} else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
			System.out.println("Stopping.");
		}
	}
}

3.測試main類LifecycleTest

package weber.test.tomcat.lifecycle;

/**
 * 
 * 測試mian
 *
 */
public class LifecycleTest {

	public static void main(String[] args) throws InterruptedException {
		
		//new 一個組件實例
		LifecycleComponent compoment = new LifecycleComponent();
		//給組件註冊事件監聽器
		compoment.addLifecycleListener(new SimpleLifecycleListener());
		//組件調用Lifecycle的啓動函數
		compoment.start();
		Thread.sleep(1000);
		//組件調用Lifecycle的停止函數
		compoment.stop();
	}

}

運行結果:

SimpleLifecycleListener's event before_start
LifecycleComponent start
SimpleLifecycleListener's event after_start
SimpleLifecycleListener's event before_stop
SimpleLifecycleListener's event stop
Stopping.
LifecycleComponent stop
SimpleLifecycleListener's event after_stop


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章