Tomcat由多個組件組成,那么Tomcat是怎么對他們的生命周期進行管理的么,這里將從Tomcat源碼去分析其生命周期的實現;
Bootstrape類為Tomcat的入口,所有的組件夠通過實現Lifecycle接口來管理生命周期,Tomcat啟動的時候只需調用Server容器的start(),然后父容器依序啟動他所包含的子容器,關閉也是如此。
通過閱讀源碼可知一個Server里包含一個或多個Service,一個Service里包含一個Container,一個或多個Connector、Container又包含了Engine、Host、Context、Wrapper四個容器;
?
Tomcat的組件啟動順序為:
StandardServer.start()——》StandardServer.startInternal()——》StandardService().start()——StandardService.startInternal() ——>》StandardEngine().start()——》StandardEngine.startInternal()—》StandardEngine中啟動其他組件,組件關閉也是如此;
現在我們通過Demo簡單模擬Tomcat的啟動

模擬Demo UML類圖

模擬Demo時序圖
主要代碼段如下:
Catalina類:
package co.solinx.Pattern.Observer;/** * Created by LX on 2014/11/26. */public class Catalina { public static void main(String[] args) { //Tomcat為多個組件組成的server為最外圍最大的一個 StandardServer server = new StandardServer(); //為server添加監聽器 server.addLifecycleListener(new ContextConfig()); //添加一個service StandardService service = new StandardService(); server.AddService(service); //為service添加監聽器 service.addLifecycleListener(new ContextConfig()); //添加一個engine StandardEngine standardEngine = new StandardEngine(); //為engine添加監聽器 standardEngine.addLifecycleListener(new EngineConfig()); StandardHost standardHost = new StandardHost("localhost");// StandardHost testHost = new StandardHost("test");// standardHost.addLifecycleListener(new EngineConfig()); standardEngine.addChild("localhost", standardHost);// standardEngine.addChild("test", testHost); //往service添加engine容器 service.setContainer(standardEngine); try { server.start(); } catch (LifecycleException e) { e.PRintStackTrace(); } }}StandardServer類
package co.solinx.Pattern.Observer;/** * Created by LX on 2014/11/26. */public class StandardServer extends LifecycleBase implements Context { Service services[] = new Service[0]; @Override protected void startInternal() throws LifecycleException { for (int i = 0; i < services.length; i++) { services[i].start(); } System.out.println("StandardServer start"); } public void AddService(Service service) { Service result[] = new Service[services.length + 1]; System.arraycopy(services, 0, result, 0, services.length); result[services.length] = service; services = result; } }StandardService類:
package co.solinx.Pattern.Observer;/** * Created by LX on 2014/11/26. */public class StandardService extends LifecycleBase implements Service, Context { protected ContainerBase container = null; @Override protected void startInternal() throws LifecycleException { container.start(); System.out.println("StandardService start"); } public void setContainer(ContainerBase container) { this.container = container; }}StandardEngine類:
package co.solinx.Pattern.Observer;/** * Created by LX on 2014/11/26. */public class StandardEngine extends ContainerBase { @Override protected void startInternal() throws LifecycleException { super.startInternal(); System.out.println("StandardEngine start"); } protected void addChild(String key, Container container) { super.addChild(key, container); }}LifecycleSupport類:
package co.solinx.Pattern.Observer;/** * Created by LX on 2014/11/26. * 代理了具體監聽者 */public class LifecycleSupport { public LifecycleSupport(Lifecycle lifecycle) { super(); this.lifecycle = lifecycle; } private Lifecycle lifecycle = null; private LifecycleListener listeners[] = new LifecycleListener[0]; private final Object listenersLock = new Object(); // Lock object for changes to listeners public void addLifecycleListener(LifecycleListener listener) { synchronized (listenersLock) { 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[] = listeners; for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); } public void removeLifecycleListener(LifecycleListener listener) { synchronized (listenersLock) { 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; } }}模擬程序運行結果:

文章首發地址:Solinx
http://www.solinx.co/archives/86
新聞熱點
疑難解答