Tomcat中Lifecycle详解(源码阅读)
来源:互联网 发布:情趣淘宝店 编辑:程序博客网 时间:2024/06/05 03:01
在tomcat中,每一个组件生命周期都是需要统一管理的,一般是由调用该组件的组件来启动或停止当前组建,如connector组件控制processor组件启动和停止,因此每个组件主要类都会继承Lifecycle接口。tomcat中周期控制采用观察者模式来设计。其中主要类和接口如下:
- Lifecycle接口(要使用生命周期控制的类都会继承该类)
- LifecycleListener接口(监听器都会继承该类)
- LifecycleSupport类(用来对监听器进行管理)
- LifecycleEvent类(该类是一个辅助类,用来作为参数类型)
- LifecycleException类(异常类)
Talk is cheap. Show me the code.
Lifecycle接口
public interface Lifecycle { // ----------------------------------------------------- Manifest Constants 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 Methods public void addLifecycleListener(LifecycleListener listener); public LifecycleListener[] findLifecycleListeners(); public void removeLifecycleListener(LifecycleListener listener); public void start() throws LifecycleException; public void stop() throws LifecycleException;}
LifecycleListener接口
public interface LifecycleListener { public void lifecycleEvent(LifecycleEvent event);}
LifecycleSupport类
该类是一种中间类,主要目的就是对LifecycleListener[]数组进行管理。而且
public final class LifecycleSupport { // ----------------------------------------------------------- Constructors public LifecycleSupport(Lifecycle lifecycle) { super(); this.lifecycle = lifecycle; } // ----------------------------------------------------- Instance Variables private Lifecycle lifecycle = null; private LifecycleListener listeners[] = new LifecycleListener[0]; // --------------------------------------------------------- Public Methods //添加监听器,该方法中动态数组的方法值得借鉴 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; } }}
LifecycleEvent类
该类是一个辅助类,用来 lifecycleEvent(LifecycleEvent event)方法的参数类型。
public final class LifecycleEvent extends EventObject { // ----------------------------------------------------------- Constructors 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; } // ----------------------------------------------------- Instance Variables private Object data = null; private Lifecycle lifecycle = null; private String type = null; // ------------------------------------------------------------- Properties public Object getData() { return (this.data); } public Lifecycle getLifecycle() { return (this.lifecycle); } public String getType() { return (this.type); }}
LifecycleException类
该类只是一个异常类,该处代码省略。
connector中的实际调用
如tomcat4中connector组件的默认实现类HttpConnector就实现了Lifecycle接口,如下所示
public final class HttpConnector implements Connector, Lifecycle, Runnable{//实例化一个LifecycleSupport 类,用来管理监听器的注册和取消。protected LifecycleSupport lifecycle = new LifecycleSupport(this);public void addLifecycleListener(LifecycleListener listener) { lifecycle.addLifecycleListener(listener); } public LifecycleListener[] findLifecycleListeners() { return lifecycle.findLifecycleListeners(); } public void removeLifecycleListener(LifecycleListener listener) { lifecycle.removeLifecycleListener(listener); }public void start() throws LifecycleException { // Validate and update our current state if (started) throw new LifecycleException (sm.getString("httpConnector.alreadyStarted")); threadName = "HttpConnector[" + port + "]"; //激活监听器,该方法会调用各个监听器的lifecycleEvent()方法。 lifecycle.fireLifecycleEvent(START_EVENT, null); started = true;/* // Start our background thread threadStart(); // Create the specified minimum number of processors while (curProcessors < minProcessors) { if ((maxProcessors > 0) && (curProcessors >= maxProcessors)) break; HttpProcessor processor = newProcessor(); recycle(processor); }*/ } public void stop() throws LifecycleException { // Validate and update our current state if (!started) throw new LifecycleException (sm.getString("httpConnector.notStarted")); lifecycle.fireLifecycleEvent(STOP_EVENT, null); started = false; // Gracefully shut down all processors we have created for (int i = created.size() - 1; i >= 0; i--) { HttpProcessor processor = (HttpProcessor) created.elementAt(i); if (processor instanceof Lifecycle) { try { ((Lifecycle) processor).stop(); } catch (LifecycleException e) { log("HttpConnector.stop", e); } } } /* synchronized (threadSync) { // Close the server socket we were using if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { ; } } // Stop our background thread threadStop(); } serverSocket = null; }*/}
1 0
- Tomcat中Lifecycle详解(源码阅读)
- Tomcat 源码阅读(八)Lifecycle
- Tomcat中session详解(源码阅读)
- Tomcat源码Lifecycle分析
- Tomcat源码分析-Lifecycle
- tomcat源码阅读(二) Digester方法详解
- Tomcat从零开始(八)Lifecycle
- Tomcat Lifecycle
- Tomcat源码阅读(一)初始化
- Tomcat源码阅读(二)Bootstrap
- Tomcat源码阅读(三)Catalina.createStartDegester
- Tomcat源码阅读(三)Catalina
- Tomcat源码阅读(四)Server
- Tomcat源码阅读(五)Service
- Tomcat连接器运行过程(源码阅读)
- 阅读TOMCAT 8源码(一)
- Tomcat 源码阅读(一)总概
- Tomcat 源码阅读(二)Catalina.load
- 计算机系统结构 存储体系
- 最短路径(Floyd算法)
- UVA 1328 Period
- 计算机系统结构 互连网络
- 计算机系统结构 输入/输出系统
- Tomcat中Lifecycle详解(源码阅读)
- PHP判断几天是某月的上旬、中旬或下旬
- Android登陆页面,获取验证码按钮的实现
- Volley的使用(一) get请求和获取网络图片
- 面试题精讲
- Java根据sessionId获取Session对象
- 删除2345网页导航
- 在Android上使用官方Lambda支持 - Android N & Jack工具(兼容旧平台)
- 【HUSTOJ】1066: 斜角III