public void addService(Service service);
public void removeService(Service service);
通过实现如下接口来完成通过service的名称返回Service的操作:
public Service findService(String name);
通过实现如下接口来完成获取返回Server中所有Service的操作:
public Service[] findServices();
对于Server的网络内容的设置和获取通过如下方法,包括设置地址,端口:
public int getPort();
public void setPort(int port);
public String getAddress();
public void setAddress(String address);
获取和指定shotdown命令:
public String getShutdown();
public void setShutdown(String shutdown);
获取和设置父类的加载器:
public ClassLoader getParentClassLoader();
public void setParentClassLoader(ClassLoader parent);
如果设置了Catalina,那么也提供获取和设置的方法:
public Catalina getCatalina();
public void setCatalina(Catalina catalina);
通过Server接口至少我们能够得出结论:Server中包含多个Service对象。
结构如下:
值得注意的是Server借口继承了Lifecycle接口,
public interface Server extends Lifecycle
Lifecycle 接口就是来控制Server极其组件的生命周期的,组件实现Lifecycle借口,就可以提供一致化的机制来启动和停止组件。下面看一下 Lifecycle的内容:
首先是一些常量列表,小插曲,在Tomcat7.0.53中,tomcat在此处的注释有小问题,有兴趣的人可以看一下。
//组件初始化之前的事件
public static final String BEFORE_INIT_EVENT = "before_init";
//组件初始化之后的事件
public static final String AFTER_INIT_EVENT = "after_init";
//组件start的事件
public static final String START_EVENT = "start";
//组件start之前的事件
public static final String BEFORE_START_EVENT = "before_start";
//组件start之后的事件
public static final String AFTER_START_EVENT = "after_start";
//组件stop之后的事件
public static final String STOP_EVENT = "stop";
//组件stop之前的事件
public static final String BEFORE_STOP_EVENT = "before_stop";
//组件stop之后的事件
public static final String AFTER_STOP_EVENT = "after_stop";
//组件destrop之后的事件
public static final String AFTER_DESTROY_EVENT = "after_destroy";
//组件destrop之前的事件
public static final String BEFORE_DESTROY_EVENT = "before_destroy";
//组件periodic的事件
public static final String PERIODIC_EVENT = "periodic";
下面就是Lifecycle接口定义的方法列表:
既然Server中包含的主要对象就是Service,实现了Service就是对外提供服务了,下面在看一下Service的接口定义:
看了定义的方法之后,很想逐一说明一下,可能会发现问题:
在Service中添加或移除connector的方法:
public void addConnector(Connector connector);
public void removeConnector(Connector connector);
说明在每个Service中有多个Connector。
在Service中添加或移除Executor的方法:
public void addExecutor(Executor ex);
public void removeExecutor(Executor ex);
返回所有Connector的方法:
public Connector[] findConnectors();
返回所有executor的方法:
public Executor[] findExecutors();
设置和获取Container的方法:
public Container getContainer();
public void setContainer(Container container);
获取和设置关联的Server对象的方法:
public void setServer(Server server);
public Server getServer();
给Service设置获取名称的方法:
public void setName(String name);
public String getName();
以上就是Service接口定义的主要方法,得出在Service中包含一个或多个Connector,包含一个或多个Executors和一个Container对象。接着上面的Server---Service图我们可以得出如下关系图:
|---------Connector
Server----Service----|
|----------Container
由此可知在Tomcat中的两个重要的组件就是Connector和Container。下面我们着重看一下Connector和Container。
Container的主要功能是执行从客户端接收的请求,然后给出回应。看一下Container接口定义的方法:
添加,删除和获取一个子Container:
public void addChild(Container child);
public void removeChild(Container child);
public Container findChild(String name);
public Container[] findChildren();
对应的在Container中就应该有设置和获取父Container的方法:
public void setParent(Container container);
public Container getParent();
在Container中添加,移除和获取事件监听器:
public void addContainerListener(ContainerListener listener);
public void removeContainerListener(ContainerListener listener);
public ContainerListener[] findContainerListeners();
在Container中添加,移除和获取属性变更监听器:
public void addPropertyChangeListener(PropertyChangeListener listener);
public void removePropertyChangeListener(PropertyChangeListener listener);
触发Container事件:
public void fireContainerEvent(String type, Object data);
记录指向这个container的请求与响应的日志:
public AccessLog getAccessLog();
设置和获取作用在该container及其子container上的方法的延迟时间,单位秒:
public void setBackgroundProcessorDelay(int delay);
public int getBackgroundProcessorDelay();
设置和获取相关的集群:
public void setCluster(Cluster cluster);
public Cluster getCluster();
设置和获取Loadeer:
public void setLoader(Loader loader);
public Loader getLoader();
设置和获取负责管理该Container对应Session pool的Manager对象:
public void setManager(Manager manager);
public Manager getManager();
设置和获取Container的名字描述:
public void setName(String name);
public String getName();
设置和获取父类的ClassLoader:
public void setParentClassLoader(ClassLoader parent);
public ClassLoader getParentClassLoader();
获取Pipeline,负责管理该Container中的相关值:
public Pipeline getPipeline();
设置和获取Container的上下文资源:
public void setResources(DirContext resources);
public DirContext getResources();
设置和获取启动和停止children container的线程数,可以并行的启动和停止子container:
public void setStartStopThreads(int startStopThreads);
public int getStartStopThreads();
Connector类中的变量已经方法实现如下:
代表一个Container的入口的变量: