Server和Service
在前面的章节中Catalina已经有了连接器(Connector)和容器(Container),但是还缺少一种好的启动和停止Servlet容器的机制,Server和Service能很好的解决这个问题。
Server
org.apache.catalina.Server接口表示完整的Servlet容器和相关的其他组件,提供了优雅启动和停止整个系统的机制,有了它以后没有必要再分别去启动连接器和容器。
当你启动一个Server的时候,它会启动在其内的所有组件,然后等待识别的shutdown命令,一旦通过指定的端口发送了shutdown命令,被server接收到以后它将停止所有的组件,Server定义如下:
public interface Server {
public String getInfo();
public NamingResources getGlobalNamingResources();
public void setGlobalNamingResources(NamingResources globalNamingResources);
public int getPort();
public void setPort(int port);
public String getShutdown();
public void setShutdown(String shutdown);
public void addService(Service service);
public void await();
public Service findService(String name);
public Service[] findServices();
public void removeService(Service service);
public void initialize()throws LifecycleException;
}
通过addService方法可以下Server添加Service对象。
StandardServer
StandardServer是Server接口的标准实现,其中最重要的是他的shutdown机制,同时也包括一些解析Server配置(server.xml)的方法。
一个Server包括一个或多个Service,提供了addService和removeService方法,作为组件,Server也实现了生命周期的相关功能,提供了initialize、start、stop和await方法。
initialize方法
initialize方法会初始化Service并添加到Server实例当中:
public void initialize()throws LifecycleException {
if (initialized)
throw new LifecycleException (
sm.getString("standardServer.initialize.initialized"));
initialized = true;
// Initialize our defined Services
for (int i = 0; i < services.length; i++) {
services[i].initialize();
}
}
在StandardServer中增加了initialized变量,防止重复初始化Server。
start方法
start方法会启动所有的Service,从而启动其它组件,像连接器、容器等:
public void start() throws LifecycleException {
// Validate and update our current component state
if (started)
throw new LifecycleException
(sm.getString("standardServer.start.started"));
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
// Start our defined Services