How Tomcat work 之第十四章之service
来源:互联网 发布:西门子plc编程技巧 编辑:程序博客网 时间:2024/04/30 02:20
Service
org.apache.catalina.Service 这个接口表示一个Service。一个Service可以拥有一个容器和多个连接器。你可以添加尽可能多的连接器,这些连接器与这个容器是相关的。清单14.6是Service的接口。
package org.apache.catalina;public interface Service { public Container getContainer(); public void setContainer(Container container); public String getInfo(); public String getName(); public void setName(String name); public Server getServer(); public void setServer(Server server); public void addConnector(Connector connector); public Connector[] findConnectors(); public void removeConnector(Connector connector); public void initialize() throws LifecycleException;}
StandardService
org.apache.catalina.core.StandardService类是Service的标准实现。这个类的initialize方法初始化了添加到这个Service的所有的连接器。这个类同时也实现了org.apache.catalian.Lifecycle接口。它的start方法开启了容器和所有的连接器。
Container和Connector(s)
一个StandardService实例包含了两类组件:一个容器和一个或者多个连接器。拥有更多的的连接器使得Tomcat能够支持更多的协议。一个连接器可以服务HTTP请求则另一个连接器可以支持HTTPS请求。
StandardService类使用container变量,一个对象的引用作为Container的实例,以conncetors数组代表所有的连接器。
private Container container = null;private Connector connectors[] = new Connector[0];
使用setContainer方法使一个container与一个Service关联。代码清单如下:
public void setContainer(Container container) {Container oldContainer = this.container;
if ((oldContainer != null) && (oldContainer instanceof Engine))
instanceof Engine)) ((Engine) oldContainer).setService(null);
this.container = container;
if ((this.container != null) && (this.container instanceof Engine))
((Engine) this.container).setService(this);
if (started && (this.container != null)
&&(this.container instanceof Lifecycle)) {
try {
((Lifecycle) this.container).start();
}catch (LifecycleException e) {
;
}
}
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++)
connectors[i].setContainer(this.container);
}
if (started && (oldContainer != null) &&
(oldContainer instanceof Lifecycle)) { try {
((Lifecycle) oldContainer).stop();
}
catch (LifecycleException e) {
;
}
}
// Report this property change to interested listeners
support.firePropertyChange("container", oldContainer,
this.container);}
与这个Service相关联的container通过setContainer方法传递,那么这个Service相关联的每个connector对象在container与每个connector之间建立了一种关联。
为了给Service对象添加一个连接器,使用addConnector方法。为了移除一个连接器,调用removeConnector方法。addConnector和removeCon方法的代码清单如下:
public void addConnector(Connector connector) {
synchronized (connectors) {
connector.setContainer(this.container);
connector.setService(this);
Connector results[] = new Connector[connectors.length + 1];
System.arraycopy(connectors, 0, results, 0, connectors.length);
results[connectors.length] = connector;
connectors = results;
if (initialized) {
try {
connector.initialize();
}
catch (LifecycleException e) {
e.printStackTrace(System.err);
}
}
if (started && (connector instanceof Lifecycle)) {
try{
((Lifecycle) connector).start();
}
catch (LifecycleException e) {
;
}
}
// Report this property change to interested listeners
support.firePropertyChange("connector", null, connector);
}
}
public void removeConnector(Connector connector) {
synchronized (connectors) {
int j = -1;
for (int i = 0; i < connectors.length; i++) {
if (connector == connectors [i]) {
j = i;
break;
}
}
if (j < 0)
return;
if (started && (connectors[j] instanceof Lifecycle)) {
try {
((Lifecycle) connectors[j]).stop();
}
catch (LifecycleException e) {
;
}
}
connectors[j].setContainer(null);
connector.setService(null);
int k = 0;
Connector results[] = new Connector[connectors.length - 1];
for (int i = 0; i < connectors.length; i++) {
if (i != j)
results[k++] = connectors[i];
}
connectors = results;
// Report this property change to interested listeners
support.firePropertyChange("connector", connector, null);
}
}
addConnector方法初始化和开启添加的连接器。
Lifecycle方法
生命周期方法是从Lifecycle接口中继承的start方法和stop方法,外加initialize方法。initialize方法调用了与这个Service相关的所有connector的initialize方法。这个方法的代码清单如下:
public void initialize() throws LifecycleException { if (initialized) throw new LifecycleException (sm.getString("StandardService.initialize.initialized"));
initialized = true;
// Initialize our defined Connectors
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++) {
connectors[i].initialize();
}
}}
start方法启动了关联的container和添加到这个Service的connector。代码清单如下:
public void start() throws LifecycleException { // Validate and update our current component state
if (started) {
throw new LifecycleException
(sm.getString("standardService.start.started"));
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
System.out.println
(sm.getString("standardService.start.name", this.name));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
// Start our defined Container first
if (container != null) {
synchronized (container) {
if (container instanceof Lifecycle) {
((Lifecycle) container).start();
}
}
}
// Start our defined Connectors second
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++) {
if (connectors[i] instanceof Lifecycle)
((Lifecycle) connectors[i]).start();
}
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);}
stop方法停止了相关联的container和所有的连接器。其代码清单如下:
public void stop() throws LifecycleException {// Validate and update our current component state
if (!started) {
throw new LifecycleException
(sm.getString("standardService.stop.notStarted"));
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
System.out.println
(sm.getString("standardService.stop.name", this.name));
started = false;
// Stop our defined Connectors first
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++) {
if (connectors[i] instanceof Lifecycle)
((Lifecycle) connectors[i]).stop();
}
}
// Stop our defined Container second
if (container != null) {
synchronized (container) {
if (container instanceof Lifecycle) {
((Lifecycle) container).stop();
}
}
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null);}
- How Tomcat work 之第十四章之service
- how tomcat work之第十四章:server and service
- How Tomcat work 之第十四章之server and services 之application
- How Tomcat Work 之 第十七章:Tomcat Startup
- How Tomcat work 之第十五章之Digester
- How Tomcat Work 之 第十六章 之 ShutDown Hook
- How tomcat work 之 第十五章之Digester之ContextConfig之the defaultConfig Method
- How Tomcat work之第十五章之Digester之setting property
- How Tomcat Work 之Digester之The Applicaition
- How Tomcata work之第十五章之ContextConfig
- 第十四章 Vim之替换
- [摘录]How browsers work之页面渲染流程
- How Tomcat works之第十一章之The ServletConfig 对象
- How Tomcat works之第十一章之Parent and Child
- How Tomcat works 之第十一章之StandardWrapperValue
- How tomcat works 之第十一章之 FilterDef
- How Tomcat works之第十一章之ApplicationFilterChain
- How Tomcat Works之第十二章之invoke方法
- Java基础加强-JDK 5.0 新特性
- Android开发-android架构
- Java基础加强-java5的枚举
- 对数字、字符的全排列
- hdoj 1280 前m大的数
- How Tomcat work 之第十四章之service
- HDU 1068 Girls and Boys (匈牙利算法 二分图的最大独立集数 )
- oracle split去逗号,行列转换
- WIP完工入库及完工退回的几个重要问题
- FFmpeg接口 编写视频转码测试程序结果
- hdoj 1425 sort
- 黑球白球
- Android之Monkey全参数(包含隐藏参数)
- ZOJ2110 Tempter of the Bone