Jetty源码分析(一)
一、目的
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源码分析(一)的更多相关文章
- flume jetty 进程关系 flume jetty 跨域问题 jetty 源码分析
flume jetty 跨域问题 13481 httpSource的端口进程号 = flume 启动后的进程号 [root@c log]# netstat -atp Active Internet ...
- Jetty 源码分析
一. 总括 你了解Jetty 吗,就像我们所熟知的Tomcat一样, Jetty是一个免费的开放源码的100%纯Java的Http服务器和Servlet容器. Jetty具备以下特点: ...
- Jetty - Container源码分析
1. 描述 Container提供管理bean的能力. 基于Jetty-9.4.8.v20171121. 1.1 API public interface Container { // 增加一个bea ...
- 《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》一书正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- Solr5.0源码分析-SolrDispatchFilter
年初,公司开发法律行业的搜索引擎.当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发.但是,对solr的还没有进行认真仔细的研究.最近,事情比较清闲,翻翻sol ...
- Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建
Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以 ...
- SparkThriftServer 源码分析
目录 版本 起点 客户端--Beeline 服务端 Hive-jdbc TCLIService.Iface客户端请求 流程 SparkThrift 主函数HiveThriftServer2 Thrif ...
随机推荐
- Shell学习笔记 - 环境变量配置文件(转)
一.source命令 功能:在当前bash环境下读取并执行配置文件中的命令 1. 命令格式 source 配置文件 或 . 配置文件 2. 命令示例 [root@localhost ~]# sou ...
- ubuntu pip 安装django报错解决
系统版本 ubuntu Kylin 16.04 LTS 安装pip3 安装 Django 总是提示time out,无法安装. 逛了好多论坛终于遭到了解决办法,分享保存: sudo pi ...
- WebService基本概念及原理
一.Web Service基本概念 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.Web Service也叫XML Web Service WebService是一种可以接收从I ...
- MyElipes遇到 source not found解决方案(查看.class文件源码一劳永逸的解决方法)
在用Myeclipse 或者是eclipse进行开发时候经常遇到这个问题. File class editor source not found 问题.原因很简单,就是因为这是一个源码包,相应的没有编 ...
- maven建立本地仓库
maven 建立本地仓库 博客分类: java,maven,nexus 前面我讲到为什么要使用 Maven, Maven 的安装,以及 如何与 IDE 集成等,前面的介绍可以认为是一个 Hello ...
- Java Calendar 类的时间操作
Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...
- HR开发 读取员工工资
1.使用函数读取员工工资. ①数据结构工资结果 DATA: GT_RGDIR TYPE TABLE OF PC261 , GS_RGDIR TYPE PC261 , GT_PAYRESULT TYPE ...
- eclipse配置javaee环境
笔者开发javaee项目时惯用myeclipse,但由于个人笔记本性能较低,myeclipse对内存的消耗极大,所以考虑换成eclipse开发.本文介绍eclipse配置javaee开发环境的一些体会 ...
- 不一样的角度 解读微信小程序
不一样的角度 解读微信小程序 七月在夏天· 2 天前 前段时间看完了雨果奖中短篇获奖小说<北京折叠>.很有意思的是,张小龙最近也要把应用折叠到微信里,这些应用被他称为:小程序. 含着金钥匙 ...
- STL 跨模块 调用 异常 解决
本文为转载别人的,以作收藏之用 百度了一天,现在把结论放上边: 1.不要用STL(std::string属于STL)来跨模块传输数据,例如:dll(so)之间,dll(so)和exe(elf)之间. ...