分享

在应用中使用嵌入式Tomcat

 涅槃沉殇 2018-01-11

omcat5中的Embeded版本,为应用中集成完整的Web服务提供了尽可能大的空间,不仅使开发者容易获得对标准HTTP的处理,还有SSL的通讯处理,使开发者很容易就可以对原有非Web系统进行扩展以支持瘦客户端应用,通向Web大门的钥匙已经放在这里,剩下的就是看你怎样来发挥了。

Tomcat严格意义上不是一个真正的AppServer,只是支持运行Servlet和Jsp的Web容器,此外扩展了一些AppServer的功能,如数据库连接池,JNDI等,如何提炼,或者说把Tomcat整理成一个最小的集合成为Tomcat嵌入版本的关键,从Tomcat5.0开始提供和支持Embeded版本,即最简化Tomcat Server,下面就针对Tomcat Server的Embeded版本进行介绍,怎样把Tomcat集成到Java应用中。

首先可以在http://apache.mirrors./jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28-embed.tar.gz下载Tomcat的Embeded版本,下载解压后把最里层的jakarta-tomcat-5.0.28-embed目录copy到容易查找的目录,为简易需要更名为EmbeddedTomcat,作为嵌入Tomcat的工作目录。

首先我们需要了解Tomcat在工作时的层次情况,它按照: 上面是Tomcat实现的内部工作结构:

一个Server含有几个Connector,比如non-SSL HTTP/1.1 Connector on port 8080,SSL HTTP/1.1 Connector on port 8443和AJP 1.3 Connector on port 8009。连接器就是接受客户端情况然后封装成request和response对象交给容器处理。

通常是一个Engine,其中Engine里含有1个Host,1个Host 内可以含有多个Context,Context代表Web应用,即1个Host里可以包含多个Web应用,tomcat的webapps目录里面防止的就是一个个web应用。Engine接收Service发过来的请求(通过Connector),交给相应的Host进行处理,然后Host交给具体的Context。

下面是非常简单的创建Embeded tomcat的例子,示意其使用

把tomcat-embed目录下的lib内的所有jar包引入到项目的环境中,即完成了项目的环境搭建。在应用里开发嵌入式Tomcat,需要根据以下步骤: 1)创建org.apache.catalina.startup.Embedded实例,其代表嵌入式Tomcat Server的实例; 2)创建org.apache.catalina.Engine 实例,代表上面XML结构示例中的Engine,作为容器用来包含Host节点; 3)创建org.apache.catalina.Host实例,代表虚拟主机服务,把它加入到2)中产生的Engine; 4)创建一个或多个org.apache.catalina.Context实例,代表Web应用,每个Web应用都需要加入到3)产生的Host中; 5)最后创建org.apache.catalina.Connector实例,把它加入1)创建的tomcat实例中,它用来接收客户发出的请求。

具体和完整的代码如下:

[java] view plain copy

  1. import .File;  
  2. import .InetAddress;  
  3. import .UnknownHostException;  
  4.   
  5. import org.apache.catalina.Context;  
  6. import org.apache.catalina.Engine;  
  7. import org.apache.catalina.Host;  
  8. import org.apache.catalina.Logger;  
  9. import org.apache.catalina.startup.Embedded;  
  10.   
  11. public class TomcatService {  
  12.     public static void main(String[] args) {  
  13.         // 设置Tomcat的工作目录,并启动Tomcat Server  
  14.         String path = "F:/360云盘/eclipse/eclipse/workspace/EmbeddedTomcat";  
  15.         Embedded tc = createTomcat(path);  
  16.         try {  
  17.             tc.start();  
  18.             System.out  
  19.                     .println("---------- Tomcat Server start over. ------------");  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.     }  
  24.   
  25.     private static Embedded createTomcat(String path) {  
  26.         // 创建嵌入式Tomcat Server的实例  
  27.         Embedded tomcat = new Embedded();  
  28.         // 设置Tomcat的工作目录  
  29.         // catalina.home就是tomcat的存放路径,例如:D:\360云盘\Tools\apache-tomcat-7.0.39  
  30.         // 这里存放路径就是项目路径F:/360云盘/eclipse/eclipse/workspace/EmbeddedTomcat,因为是内嵌tomcat  
  31.         tomcat.setCatalinaHome(path);  
  32.         // 产生Tomcat引擎  
  33.         Engine engine = tomcat.createEngine();  
  34.         engine.setName("EmbededServer");  
  35.         // 创建Host,设置Host的工作目录  
  36.         Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()  
  37.                 + "/webapps");  
  38.         // 把Host加入Engine  
  39.         engine.addChild(host);  
  40.         engine.setDefaultHost(host.getName());  
  41.         System.out.println("host.getAppBase():" + host.getAppBase());  
  42.         String path1 = host.getAppBase() + "/ROOT";  
  43.         String path2 = host.getAppBase() + "/manager";  
  44.         if (!new File(path1).exists()) {  
  45.             System.err.println("请检查instance1应用的目录以及相关资源是否存在.");  
  46.             return null;  
  47.         }  
  48.         // 创建instance1的Context,并加入Host中  
  49.         Context ctxt = tomcat.createContext("/ROOT", path1);  
  50.         Context ctxt1 = tomcat.createContext("/manager", path2);  
  51.           
  52.         host.addChild(ctxt);  
  53.         host.addChild(ctxt1);  
  54.   
  55.         tomcat.addEngine(engine);  
  56.         tomcat.setDebug(Logger.WARNING);  
  57.         try {  
  58.             // Tomcat加入Connector,监听本地(127.0.0.1)的访问  
  59.             System.out.println(InetAddress  
  60.                     .getByName("127.0.0.1"));  
  61.             tomcat.addConnector(tomcat.createConnector(InetAddress  
  62.                     .getByName("127.0.0.1"), 9999false));  
  63.         } catch (UnknownHostException e) {  
  64.             System.err.println("绑定Tomcat Server到127.0.0.1:8080失败,请检查端口是否被占用.");  
  65.             e.printStackTrace();  
  66.             tomcat = null;  
  67.         }  
  68.         return tomcat;  
  69.     }  
  70. }  


以上代码亲测可用,这里我同时启动了两个项目,manager和ROOT,下面是我的工程目录

在浏览器输入http://localhost:9999/ROOT,显示如下:


在浏览器输入http://localhost:9999/manager,显示如下:


在这里需要注意,由于嵌入式版本Tomcat没有common/lib目录,一些需要的Jar包可以复制到JDK的/jre/lib/endorsed目录下进行使用。


在OFBiz中默认使用的embeded tomcat,具体的可以参考里面对于嵌入式启动相关的内容

这里我们讨论了如何使用Embedded Tomcat,并没有提现出使用内嵌Tomcat的好处,我们可以把上面的ROOT和manager项目分开成为两个单独的项目,这样,启动的时候就可以独立启动,配置不同的监听端口的话可以同时启动,主要是避免需要调试多个项目的时候同时在一个Tomcat里面启动,改了一个项目,就要重启Tomcat,浪费时间,分开之后,就可以独立进行发布,各自互不影响,调试、启动方便。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多