How tomcat works 读书笔记十四 服务器组件和服务组件
之前的项目还是有些问题的,例如
1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https。
2 对容器的关闭只能是粗暴的关闭Bootstrap。
服务器组件
org.apache.catalina.Server接口的实例用来表示Catalina的整个servlet引擎。
我们使用Server就是因为,它用一种优雅的方式来启动/关闭整个系统。
下面是启动和停止机制是如何工作的。当服务器启动的时候,它启动它内部的所有组件。然后无限期的等待关闭命令,如果你想要关闭系统,发送一个关闭命令道指定端口即可。当服务器收到正确的关闭指令后,它停止所有组件的服务。
服务器还使用了另外一个组件,即服务组件,它用来持有组件,例如容器或者一个多个的连接器。服务组件将在本章的 service 小节中介绍。(注意有服务器组件,也有服务组件,这两个是不一样的。)
Server接口中属性 shutdown 用来持有一个停止服务的指令。属性 port 则是服务器等待关闭命令的端口。可以调用服务器的 addService 方法将服务添加到服务器。使用removeService 方法将服务删除。findServices 返回所有服务器中所有的服务。
StandardServer类
StandardServer类是Server接口的标准实现。在这里,我们主要介绍它的四个方法。initialize(),start(),stop(),await();
我们一个一个来说。
initialize方法
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(); } }
我们能看到这里使用了一个initialized来标识服务器是否已经初始化,同时初始化它所包含的服务组件。
另外在stop中,initialized并没有更改,因此如果服务器先初始化,再关闭,等再次初始化的时候会抛出异常。
start方法
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 ... started = true; // Start our defined Services synchronized (services) { for (int i = 0; i < services.length; i++) { if (services[i] instanceof Lifecycle) ((Lifecycle) services[i]).start(); } } // Notify our interested LifecycleListeners ... }
和初始化干的事情差不多,循环启动它所关联的服务组件。另外在stop方法中,started会被置为false。
stop方法
public void stop() throws LifecycleException { // Validate and update our current component state if (!started) throw new LifecycleException (sm.getString("standardServer.stop.notStarted")); // Notify our interested LifecycleListeners ... started = false; // Stop our defined Services for (int i = 0; i < services.length; i++) { if (services[i] instanceof Lifecycle) ((Lifecycle) services[i]).stop(); } // Notify our interested LifecycleListeners ... }
关闭所有的服务组件。
await方法
这里不再贴出代码,await做的事就是监听8005端口,如果用户给8005端口发来"SHUTDOWN"就关闭serverSocket,然后await方法就执行完了。
现在再说说initialize方法,start方法,await方法,stop四者者都是在Bootstrap里调用的。
当await方法执行完毕后,就会调用服务器的stop方法。
Service接口
org.apache.catalina.Service 接口用于表示服务。一个服务可以有一个容器和多个连接器。你可以添加多个连接器 ,并将它们跟容器相关联。
StandardService类
StandardService是Service接口的标准实现。
容器与连接器
一个 StandardService 实例包括两种组件:一个容器和多个连接器。多个连接器可以使得 Tomcat 能服务于多个协议。一个协议用处处理 HTTP 请求,另一个用于处理 HTTPS 请求。
StandardService 类用 container 变量来持有容器实例,用 connectors 数组来持有所有的连接器
private Container container = null; private Connector connectors[] = new Connector[0];
要将一个容器跟一个服务相关联,可以使用它的 setContainer 方法,
在setContainer中,会把container传递给每一个connector。
synchronized (connectors) { for (int i = 0; i < connectors.length; i++) connectors[i].setContainer(this.container); }
要给一个服务添加连接器,可以使用 addConnector 方法。在添加连接器的同时也会初始化他们。
要删除一个连接器,可以使用 removeConnector 方法。
与生命周期相关的方法
这里主要包含三个方法,initialize,start,stop。
initialize功能就是调用所以连接器的initialize方法。
start功能就是启动容器和若干个连接器。
stop功能就是关闭容器和若干个连接器。
服务组件的这三个方法都会在服务器组件里相应的方法里被调用,而服务器组件的这三个方法是在Bootstrap里调用的。
应用程序
这里主要是两个类,一个是 Bootstrap 启动程序,另一个是 Stopper 类用来停止它。
Bootstrap类
public static void main(String args[]){ ...... Service service = new StandardService(); service.setName("Stand-alone Service"); Server server = new StandardServer(); server.addService(service); //把服务组件添加到服务器组件里 service.addConnector(connector); //把连接器关联到服务组件里 //StandardService class's setContainer will call all its connector's setContainer method service.setContainer(engine); //容器并没有直接和连接器关联,而是和服务组件关联 // Start the new server if (server instanceof Lifecycle) { try { server.initialize(); //调用initialize,start,await方法 ((Lifecycle) server).start();//这里会调用服务组件的start,来调用连接器与容器的start //连接器会在8080上等待消息.... server.await(); //除非在8005端口收到了SHUTDOWN信息 这里会一直循环 // the program waits until the await method returns, // i.e. until a shutdown command is received. } catch (LifecycleException e) { e.printStackTrace(System.out); } } // Shut down the server if (server instanceof Lifecycle) { try { ((Lifecycle) server).stop(); //收到了SHUTDOWM信息,关闭服务器组件 } catch (LifecycleException e) { e.printStackTrace(System.out); } } }
Stopper类
public class Stopper { public static void main(String[] args) { // the following code is taken from the Stop method of // the org.apache.catalina.startup.Catalina class int port = 8005; try { Socket socket = new Socket("127.0.0.1", port); OutputStream stream = socket.getOutputStream(); String shutdown = "SHUTDOWN"; for (int i = 0; i < shutdown.length(); i++) stream.write(shutdown.charAt(i)); stream.flush(); stream.close(); socket.close(); System.out.println("The server was successfully shut down."); } catch (IOException e) { System.out.println("Error. The server has not been started."); } } }
How tomcat works 读书笔记十四 服务器组件和服务组件的更多相关文章
- How tomcat works 读书笔记十五 Digester库 上
Digester库 在前面的几个章节里,我们对tomcat里各个组件的配置完全是使用写硬编码的形式完成的. 如 Context context = new StandardContext(); Loa ...
- How tomcat works 读书笔记十五 Digester库 下
在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...
- How tomcat works 读书笔记十二 StandardContext 下
对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container cont ...
- How tomcat works 读书笔记十二 StandardContext 上
在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个in ...
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- how tomcat works 读书笔记(一)----------一个简单的web服务器
http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext tran ...
- how tomcat works 读书笔记(一)----------一个简单的webserver
http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...
- How Tomcat Works读书笔记三-------连接器
几个概念 HttpServlet,Servlet Servlet是一个接口,定义了一种网络服务,我们所有的servlet都要实现它(或它的子类) HttpServlet是一个抽象类,它针对的就是htt ...
随机推荐
- Java之String类型详解
字符串的特点 A:字符串一旦被赋值,就不能改变. 注意:这里指的是字符串的内容不能改变,而不是引用不能改变. B:字面值作为字符串对象和通过构造方法创建对象的不同 String s = new Str ...
- Java中读取Excel功能实现_POI
这里使用apache的poi进行读取excel 1,新建javaproject 项目:TestExcel 2,导入包 包下载地址:http://poi.apache.org/download.html ...
- UNIX网络编程——Socket/TCP粘包、多包和少包, 断包
为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整.为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? TCP(transport cont ...
- iOS中 Realm的学习与使用 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 有问题或技术交流可以咨询!欢迎加入! 这篇直接搬了一份官方文档过来看的 由于之前没用markdown搞的乱七八糟的 ...
- 安卓自定义日期控件(仿QQ,IOS7)续
本篇是在原来的基础上修改了界面效果,使其更加接近ios7,qq等日期选择控件,看图: 源码地址:http://download.csdn.net/detail/baiyuliang2013/87601 ...
- HMAC
Hash-based Message Authentication Code HMAC是IP安全里必须实现的MAC方案,并且其他Internet协议中(如SSL)也使用了HMAC.HMAC已作为NIS ...
- android sdk里的各目录作用
android sdk里的各目录作用 AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机. SDK Manager.exe:sdk管理工具,用于管理.下载sdk.sdk工具,能及扩展 ...
- java常用IO流集合用法模板
package com.fmy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import jav ...
- (七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域监听
上节说明了如何在iOS7和iOS8上完成授权,并且开始获取位置,这一节介绍获取位置信息的方法. [定位精度] 定位精度有多种选择:根据字面意思即可理解 extern const CLLocationA ...
- XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)
XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...