用户工具

站点工具


about_jetty_11

Jetty的那些事儿 第十一章:与tomcat的对比

作者:陈科

联系方式:chenke1818@gmail.com

转载请说明出处:http://www.dumpcache.com/wiki/doku.php?id=about_jetty_11

我们由浅入深做一下几部分比较:

1.内嵌开发方式

Jetty的内嵌开发方式我们已经知道了,我们再来看下tomcat如何进行内嵌开发:

public class TomcatService {
public static void main(String[] args) {
   //设置Tomcat的工作目录,并启动Tomcat Server
   String path = "/usr/local/tomcat-embed";
   Embedded tc = createTomcat(path);
   try {
    tc.start();
    System.out.println("---------- Tomcat Server start over. ------------");
   } catch (Exception e) {
    e.printStackTrace();
   }  
}

private static Embedded createTomcat(String path) {
     //创建嵌入式Tomcat Server的实例
   Embedded tomcat = new Embedded();
        //设置Tomcat的工作目录
   tomcat.setCatalinaHome(path);
        //产生Tomcat引擎
   Engine engine = tomcat.createEngine();
   engine.setName("EmbededServer");
   //创建Host,设置Host的工作目录
   Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()
     + "/webapps");
        //把Host加入Engine
   engine.addChild(host);
   engine.setDefaultHost(host.getName());
  
   String path = host.getAppBase() + "/instance1";
   if (!new File(path).exists()) {
    System.err.println("请检查instance1应用的目录以及相关资源是否存在.");
    return null;
   }
   //创建instance1的Context,并加入Host中
   Context ctxt = tomcat.createContext("/instance1", path);
   host.addChild(ctxt);
  
   tomcat.addEngine(engine);
   tomcat.setDebug(Logger.WARNING);
   try {
      //Tomcat加入Connector,监听本地(127.0.0.1)的访问
    tomcat.addConnector(tomcat.createConnector(InetAddress
      .getByName("127.0.0.1"), 8080, false));
   } catch (UnknownHostException e) {
    System.err.println("绑定Tomcat Server到127.0.0.1:8080失败,请检查端口是否被占用.");
    e.printStackTrace();
    tomcat = null;
   }
   return tomcat;
}
}

我们可以看到,tomcat除了提供一个Embedded让你自己制定webapp目录创建实例并启动外,并没有给我们提供多大的帮助,我们还得自己打包编译部署war包,对一些小型应用真是多此一举,又不方便调试。

2.IO模型设计

在IO模型的设计上,两者大同小异,关于jetty的模型,可以查看之前的章节,这里介绍下tomcat的模型:

我们先来看下tomcat中的IO架构图:

这里的Poller其实就是Jetty中的SelectSet 唯一的区别是: 1.Jetty的线程池队列BlockingArrayQueue是一个循环队列,并且头尾指针有2把分离的锁。tomcat使用的taskQueue队列其实是基于LinkedBlockingQueue的实现,在高并发的情况下,我认为jetty的队列会略优于tomcat. 2.tomcat的线程池是使用juc原生的threadPoolExector,而jetty是自己手工维护了一个thread数组。

about_jetty_11.txt · 最后更改: 2018/10/14 15:31 (外部编辑)