一、目的

  1、了解jetty组成架构;

  2、学习jetty启动过程;

  3、学习请求访问过程;

  4、学习jetty内各模块作用,学习各模块内部代码;

二、jetty版本

  本文所学习的jetty版本为:9.2.19.v20160908

三、正文

  第一节,Server的架构图及相关类分析。

  在jetty中,Server类是最核心的类,系统启动始于Server类,启动的同时注册了ShutdownHuk事件。Server架构图如下:

  

  由上图可见,在Jetty中,和Server关系最为紧密的类有Handler,LifeCycle和Container三个接口。

  1、LifeCycle:是一个通用的组件。实现这个接口的类必须实现这个接口定义的有关生命周期的方法。主要包含以下几个和生命周期相关的方法,及由相关时间出发的监听器:

  

public void start() throws Exception;
public void stop() throws Exception;
public boolean isRunning();
public boolean isStarted();
public boolean isStarting();
public boolean isStopping();
public boolean isStopped();
public boolean isFailed(); public void addLifeCycleListener(LifeCycle.Listener listener);
public void removeLifeCycleListener(LifeCycle.Listener listener); /* ------------------------------------------------------------ */
/** Listener.
* A listener for Lifecycle events.
*/
public interface Listener extends EventListener
{
public void lifeCycleStarting(LifeCycle event);
public void lifeCycleStarted(LifeCycle event);
public void lifeCycleFailure(LifeCycle event,Throwable cause);
public void lifeCycleStopping(LifeCycle event);
public void lifeCycleStopped(LifeCycle event);
}

  2、Handler:Server的处理器,也是包含生命周期的逻辑,因此继承了LifeCycle接口。Server需要handler的实现类来处理Http请求。一般Handler做如下几个工作

    A:产生Http的响应;

    B:检验/修改请求或调用另外一个Handler(HandlerWapper);

    C:传递请求到一个或更多个Handler(HandlerCollection);

  Handler被用来传递Servlet的请求或响应对象API,但不是Servet本身。servlet容器由上下文,安全性,会话和servlet的处理程序实现,在将请求对象传递到下一个处理阶段之前修改请求对象。主要包含以下4各方法:

  

  public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException; public void setServer(Server server); @ManagedAttribute(value="the jetty server for this handler", readonly=true)
public Server getServer(); @ManagedOperation(value="destroy associated resources", impact="ACTION")
public void destroy();

  其中最主要的是handle方法,Handler的所有功能都是有handle方法来实现的。

  3、Container:Jetty的类容器(是否所有对象都由此容器保存?)

  4、其它类分析:

    A:AbstractLifeCycle,LifeCycle的抽象类实现。定义了生命周期的几个阶段,实现了LifeCycle的所有方法,并且新建了两个protected方法doStart()和doStop();在设置生命周期状态时通知响应的listener。

    B: ContainerLifeCycle,实现了LifeCycle接口(继承自AbstractLifeCycle),并保存bean的集合。有两种类型的Bean可以加入到ContainerLifeCycle中,一种是managed Bean,此种Bean是被启动,停止和消除的集合;另外一种是unmanaged Bean,此种Bean是和dump相关联的集合,但是它的生命周期必须在外部被管理。

  当一个没有携带managed状态的LifeBean bean被加入到容器中时,是通过启发式决定的。

    如果被加入的Bean正在运行,将会被作为unmanaged Bean加入;

    如果被加入的Bean没有运行,容器也没有正在运行(!running),将会被作为AUTO bean加入;

    如果被加入的Bean没有运行,容器是正在启动的(starting),将会被作为managed bean加入容器集合,并且会被启动;

    如果被加入的Bean没有运行,容器是启动好的(started),将会被作为unmanaged bean加入容器集合;

  当容器被启动时,所有被包含的managed bean也会被启动。任何被包含的Auto类型的bean将会检测它们的状态,如果已经启动了(started)就会转向unmanaged bean,其它的就会被启动并且转向managed bean。在容器启动后加入的没有启动的Bean,它们的状态需要被显示的管理。

  当正在停止容器时,被集合包含并且已经启动的bean会被停止。

  addBean(Object, boolean)方法,第一个参数的Object(可为managed,unmanaged)可以用来显式控制生命周期关系。

  这个类提供了一些实用的方法深度保存类的结构。在存储中,下列符号用来标明包含对象的类型;

    一些ContainerLifeCycle实例

      包含POJO实例

      包含可在本实例内启动、停止的managed对象

      引用带单独生命周期的unmanaged对象

      引用可变为managed和unmanaged的auto对象

protected void doStart() throws Exception
protected void doStop() throws Exception
public void destroy()
public boolean addBean(Object o)
public void addEventListener(Container.Listener listener)
public Collection<Object> getBeans()
public <T> Collection<T> getBeans(Class<T> clazz)
public <T> T getBean(Class<T> clazz)
public boolean removeBean(Object o)
public void removeEventListener(Container.Listener listener)
public void setStopTimeout(long stopTimeout)
public String dump()
public void dump(Appendable out, String indent) throws IOException ------------------------------------------------- protected void start(LifeCycle l) throws Exception
protected void stop(LifeCycle l) throws Exception
public boolean contains(Object bean)
public boolean isManaged(Object bean)
public boolean addBean(Object o, boolean managed)
public boolean addBean(Object o, Managed managed)
public void addManaged(LifeCycle lifecycle)
public void manage(Object bean)
private void manage(Bean bean)
public void unmanage(Object bean)
private void unmanage(Bean bean)
public void setBeans(Collection<Object> beans)
public void removeBeans()
private Bean getBean(Object o)
private boolean remove(Bean bean)
public void dumpStdErr()
public static String dump(Dumpable dumpable)
public void dump(Appendable out) throws IOException
protected void dumpThis(Appendable out) throws IOException
public static void dumpObject(Appendable out, Object o) throws IOException
protected void dumpBeans(Appendable out, String indent, Collection<?>... collections) throws IOException
public static void dump(Appendable out, String indent, Collection<?>... collections) throws IOException
public void updateBean(Object oldBean, final Object newBean)
public void updateBeans(Object[] oldBeans, final Object[] newBeans)

  分割线以上实现的是超类的方法,分割线以下是ContainerLifeCycle自身为实现超类或其它功能的方法。

  C:AbstractHandler,Handler的抽象实现类,同时继承了ContainerLifeCycle类。内部无特重要的逻辑处理,主要是实现了ContainerLifeCycle类中的doStart和doStop方法,及Handdler接口的setServer和getServer方法。

  D:HandlerWrapper,AbstractHandlerContainer的装饰类,设置和获取handler,为handler设置server,同时执行handler方法。

  5、Server,系统最重要的一个类,系统启动的入口。此类由ThreadPool和Connector组合而成。类中的主要方法包括设置ThreadPool和Connector,容器启动和停止,处理请求的handler方法,以及处理session的方法等。

Jetty源码分析(一)的更多相关文章

  1. flume jetty 进程关系 flume jetty 跨域问题 jetty 源码分析

    flume  jetty  跨域问题 13481 httpSource的端口进程号 = flume 启动后的进程号 [root@c log]# netstat -atp Active Internet ...

  2. Jetty 源码分析

    一. 总括      你了解Jetty 吗,就像我们所熟知的Tomcat一样, Jetty是一个免费的开放源码的100%纯Java的Http服务器和Servlet容器. Jetty具备以下特点:   ...

  3. Jetty - Container源码分析

    1. 描述 Container提供管理bean的能力. 基于Jetty-9.4.8.v20171121. 1.1 API public interface Container { // 增加一个bea ...

  4. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  5. 《深入理解Spark:核心思想与源码分析》一书正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  6. 《深入理解Spark:核心思想与源码分析》正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  7. Solr5.0源码分析-SolrDispatchFilter

    年初,公司开发法律行业的搜索引擎.当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发.但是,对solr的还没有进行认真仔细的研究.最近,事情比较清闲,翻翻sol ...

  8. Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建

    Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以 ...

  9. SparkThriftServer 源码分析

    目录 版本 起点 客户端--Beeline 服务端 Hive-jdbc TCLIService.Iface客户端请求 流程 SparkThrift 主函数HiveThriftServer2 Thrif ...

随机推荐

  1. 触摸屏测试:Tslib

    触摸屏测试:Tslib(配置了一天,心累) 总结:网上有许多关于tslib的步骤/错误总结,所以这里只是提几个我觉得比较棘手的问题: 1,我明明给arm-linux-gcc配置了环境变量,为什么还是提 ...

  2. PHP入门篇

    一.PHP-什么是变量  变量是用于存储值的,我们命令服务器去干活的时候,往往需要产生一些数据,需要临时性存放起来,方便取用.我们也可以理解为,变量就像一个购物袋,我们可以用来装苹果.榴莲(当然也可以 ...

  3. smarty 内存缓存

    <?php //缓存 //定义一个该页面的缓存文件路径 $filename="../cache/mainhc.html"; //设置一个缓存时间 $time=; //判断缓存 ...

  4. POJ1236 network of schools

    100个学校,有单向网络连接,从而分享软件. 问题一:几个学校得到软件就可使所有学校都得到? 问题二:再加几条单向网络可以使得"任意学校得到软件,就可使得所有学校都有软件"? -- ...

  5. C语言解析Ini格式文件

    引用别人的博文: http://www.open-open.com/lib/view/open1402278076447.html 可以解析 INI 格式的字符串.解析文件.保存到文件. 下面是头文件 ...

  6. 记一次u盘 无法格式化、0字节、写保护的解决过程

    首先各种找方法,下载了一堆烂七八糟的东西都没能解决 后来看了这个链接的文章 http://jingyan.baidu.com/article/6079ad0e5bdec428ff86dbcd.html ...

  7. 给div设置background-color: rgba(0, 0, 0, 0.2)属性,并加了css3动画--opacity动画淡出动画,之后div子元素的字体会抖一下

    问题:给div设置background-color: rgba(0, 0, 0, 0.2)属性,并加了css3动画--opacity动画淡出动画,之后div子元素的字体会抖一下: 解决:animati ...

  8. HR开发 SuccessFactors与HCM数据映射

    SuccessFactors Employee Central ----->> HCM 增强点 ES_PAOCF_EC_TOOLS HCM ----->> SuccessFac ...

  9. 选择流程—— switch if else结构

    一.switch switch(表达式){ case 常量1: 语句; break; case 常量2: 语句; break; … default; 语句; } 例题:运用switch结构实现购物管理 ...

  10. Android ContentProvider介绍

    在Android中数据的存储一共有五种形式,分别是:Shared Preferences.网络存储.文件存储,外储存储.SQLite.但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据 ...