一、目的

  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. Linux下错误的捕获:全局变量errno和strerror()

    经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用 ...

  2. iOS8以后自动计算cell的高度

    前提: 1.iOS系统>=8 2.cell中的每个控件布局固定,不含一些动态的模块,但是可以含有label的变化 可以采用tableView自动计算cell的高度 首先设置tableView的属 ...

  3. shell 中scp密码输入 --expect

    这里必须先安装: yum install expect -y expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录. 下面给出scp和ssh的使用示例: 1. ...

  4. EasyUI中Treegrid节点的删除

    // 删除function removes() {    var rows = ruletreegrid.treegrid('getSelections');    if (rows &&am ...

  5. js 两数相减

    var SecondPrice = document.getElementById("txtSecondPrice");  //秒杀价            var MarketP ...

  6. 对Hadoop体系的一点认识

    前言:Hadoop体系核心大多源自Google的思想,里面的思想的确很精彩!比如分布式计算,云的思想等,比起其他简单技术,更使得我想写这文章, 虽然这个东东在一般公司不可能用到! 首先由于hadoop ...

  7. JAVA网络编程

    网络技术基础  OSI模型 应用层-表示层-会话层-传输层-网络层-数据链路层-物理层  TCP/IP分层模型 应用层-传输层-网络互联层-网络接口层Socket(套接字) TCP套接字编程 Serv ...

  8. 一个login

    login 1.获取提交表单,保存到变量中.2.判断用户密码是否正确,利用Model类.3.验证用户是否激活.3.判断用户是否记住登录状态,是的话,将其用cookie和session分别保存.没有的话 ...

  9. 如何用Tacker将NFV带入OpenStack?

    最初社区里很多人争论过NFV是否属于OpenStack,而后来可以确定的是OpenStack的确占据了NFV会话中的很大一部分,并且形象地反映在了下面的ETSI MANO概念架构图中,OpenStac ...

  10. ServiceStack.OrmLite中的一些"陷阱"(3)

    前文说到如果使用多数据库(不同SQL方言)时要如何开发?其实前文(第二篇)也有“透露”到.就是直接使用库提供的OrmLiteConnection 及OrmLiteConnectionFactory(I ...