您现在的位置:主页 > 源码解读 > >

tomcat8源码教程之启动一个tomcat服务



时间: 2015-06-12 00:53     来源 : IT学习者      点击:

关键词: tomcat8    tomcat8源码    tomcat8教程   


目录页:《tomcat8源码分析


上一篇介绍了http的请求流程,共 有六步,今天讲解一下第一步,如何创建一个tomcat的服务(server) 内容来自www.itxxz.com

先看一下大体的流程:

IT学习者(www.itxxz.com)

itxxz.com


还是以test中的 org.apache.catalina.startup.TestTomcat 类为例,看如下方法的第一步,也就是第3行
  itxxz.com

 
  1. @Test  
  2. public void testProgrammatic() throws Exception {  
  3.     Tomcat tomcat = getTomcatInstance();  
  4.   
  5.     // No file system docBase required  
  6.     org.apache.catalina.Context ctx = tomcat.addContext(""null);  
  7.   
  8.     Tomcat.addServlet(ctx, "myServlet"new HelloWorld());  
  9.     ctx.addServletMapping("/""myServlet");  
  10.   
  11.     tomcat.start();  
  12.   
  13.     ByteChunk res = getUrl("http://localhost:" + getPort() + "/");  
  14.     System.out.println(res.toString());  
  15.     assertEquals("Hello world", res.toString());  
  16.  

这里new了一个getTomcatInstance(),这是TestTomcat的父类(TomcatBaseTest)中所提供的方法,是由于这是单元测试,在执行testProgrammatic()前会先执行before注解的方法,也就是setUp()方法

IT学习者(www.itxxz.com)


  copyright www.itxxz.com

  1.     @Before  
  2.     @Override  
  3.     public void setUp() throws Exception {  
  4.         super.setUp();  
  5.   
  6.         // Trigger loading of catalina.properties  
  7.         CatalinaProperties.getProperty("foo");  
  8.   
  9.         File appBase = new File(getTemporaryDirectory(), "webapps");  
  10.         if (!appBase.exists() && !appBase.mkdir()) {  
  11.             fail("Unable to create appBase for test");  
  12.         }  
  13.   
  14.         tomcat = new TomcatWithFastSessionIDs();  
  15.   
  16.         String protocol = getProtocol();  
  17.         Connector connector = new Connector(protocol);  
  18.         // Listen only on localhost  
  19.         connector.setAttribute("address",  
  20.                 InetAddress.getByName("localhost").getHostAddress());  
  21.         // Use random free port  
  22.         connector.setPort(0);  
  23.         // Mainly set to reduce timeouts during async tests  
  24.         connector.setAttribute("connectionTimeout""3000");  
  25.         tomcat.getService().addConnector(connector);  
  26.         tomcat.setConnector(connector);  
  27.   
  28.         // Add AprLifecycleListener if we are using the Apr connector  
  29.         if (protocol.contains("Apr")) {  
  30.             StandardServer server = (StandardServer) tomcat.getServer();  
  31.             AprLifecycleListener listener = new AprLifecycleListener();  
  32.             listener.setSSLRandomSeed("/dev/urandom");  
  33.             server.addLifecycleListener(listener);  
  34.             connector.setAttribute("pollerThreadCount", Integer.valueOf(1));  
  35.         }  
  36.   
  37.         File catalinaBase = getTemporaryDirectory();  
  38.         tomcat.setBaseDir(catalinaBase.getAbsolutePath());  
  39.         tomcat.getHost().setAppBase(appBase.getAbsolutePath());  
  40.   
  41.         accessLogEnabled = Boolean.parseBoolean(  
  42.             System.getProperty("tomcat.test.accesslog""false"));  
  43.         if (accessLogEnabled) {  
  44.             String accessLogDirectory = System  
  45.                     .getProperty("tomcat.test.reports");  
  46.             if (accessLogDirectory == null) {  
  47.                 accessLogDirectory = new File(getBuildDirectory(), "logs")  
  48.                         .toString();  
  49.             }  
  50.             AccessLogValve alv = new AccessLogValve();  
  51.             alv.setDirectory(accessLogDirectory);  
  52.             alv.setPattern("%h %l %u %t \"%r\" %s %b %I %D");  
  53.             tomcat.getHost().getPipeline().addValve(alv);  
  54.         }  
  55.   
  56.         // Cannot delete the whole tempDir, because logs are there,  
  57.         // but delete known subdirectories of it.  
  58.         addDeleteOnTearDown(new File(catalinaBase, "webapps"));  
  59.         addDeleteOnTearDown(new File(catalinaBase, "work"));  
  60.     }  

通过上述代码的第14行创建了一个tomcat,而且TomcatWithFastSessionIDs 是tomcat的子类 内容来自www.itxxz.com

  1. private static class TomcatWithFastSessionIDs extends Tomcat {  
  2.   
  3.     @Override  
  4.     public void start() throws LifecycleException {  
  5.         // Use fast, insecure session ID generation for all tests  
  6.         Server server = getServer();  
  7.         for (Service service : server.findServices()) {  
  8.             Container e = service.getContainer();  
  9.             for (Container h : e.findChildren()) {  
  10.                 for (Container c : h.findChildren()) {  
  11.                     Manager m = ((Context) c).getManager();  
  12.                     if (m == null) {  
  13.                         m = new StandardManager();  
  14.                         ((Context) c).setManager(m);  
  15.                     }  
  16.                     if (m instanceof ManagerBase) {  
  17.                         ((ManagerBase) m).setSecureRandomClass(  
  18.                                 "org.apache.catalina.startup.FastNonSecureRandom");  
  19.                     }  
  20.                 }  
  21.             }  
  22.         }  
  23.         super.start();  
  24.     }  
  25. }  

IT学习者(www.itxxz.com)

紧接着就开始启动一个server的服务了(上述代码第6行),server是通过StandardServer创建的,与此同时创建一个名为tomcat的service,并添加到服务中,就可以进行start了。

服务的获取方法如下,这里设计了StandardServer和StandardService:
  copyright www.itxxz.com

  1. /** 
  2.  * Get the server object. You can add listeners and few more 
  3.  * customizations. JNDI is disabled by default. 
  4.  */  
  5. public Server getServer() {  
  6.   
  7.     if (server != null) {  
  8.         return server;  
  9.     }  
  10.   
  11.     System.setProperty("catalina.useNaming""false");  
  12.   
  13.     server = new StandardServer();  
  14.   
  15.     initBaseDir();  
  16.   
  17.     server.setPort( -1 );  
  18.   
  19.     service = new StandardService();  
  20.     service.setName("Tomcat");  
  21.     server.addService( service );  
  22.     return server;  
  23. }  

 

tomcat结构图

copyright www.itxxz.com

StandardServer是什么

StandardServer标准实现Server接口,从tomcat结构层次图中知道,Server处于最外层,其他组件在其内部,起统领做,像一家公司的CEO,负责管理整个公司,Server代表完整的Servlet容器,管理维护Server和全局resource,在各个组件中共享StandardServer资源。在tomcat启动过程中由Catalina通过Digester库加载解析server.xml,创建StandardServer对象,并初始化和启动Server,Server将自己注册到JMX上面,通过tomcat管理页面查看Server状态。 本文来自www.itxxz.com


这样我们htpp请求的的第一大步就完成了,为方便理解,下一篇简单介绍下tomcat中的standardServer
  内容来自www.itxxz.com






文章除注明转载外,均为IT学习者原创或编译
欢迎任何形式的转载,但务必请以超链接形式注明出处
本文出自:IT学习者
链接地址:http://www.itxxz.com/a/code/2015/0612/809.html



微信公众号:喝咖啡的螃蟹

喝咖啡的螃蟹
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
  • 华夏主机
    2015-06-13 09:30:35发表

    大神的世界,我们不懂

  • 香港服务器
    2015-06-12 16:55:09发表

    启动一个tomcat服务,怎么需要这么多代码才能实现?好难的样子

-->