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 ...
随机推荐
- 《西科软件》一个高级PHP工程师所应该具备的
初次接触PHP,就为他的美所折服,于是一发不可收拾.很多面试,很多人员能力要求都有"PHP高级工程师的字眼",如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师 ...
- java中switch、while、do...while、for
一.Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD ...
- python autopep8
安装 使用pip install autopep8或easy_install 都可以. 使用 autopep8 -i -a 要检查的py文件路径 更多参数使用可以参考:https://github.c ...
- [goa]golang微服务框架学习--安装使用
当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...
- android app上线后bug的处理
app上线后,后期维护显得尤为重要,今天给大家分享一下app上线后出现bug后的解决方法 1.继承Application类,重写onCreate方法 import java.io.File; impo ...
- javascript父级鼠标移入移出事件中的子集影响父级的处理方法
一.我们先分析其产生的原因: 1.当鼠标从父级移入子集时触发了父级的两个事件:a.父级的mouseout事件(父级离开到子集):b.由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级 ...
- MongoDB GridFS 对图片进行增删改
using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; using MongoDB.Driver.GridFS ...
- 史上最强大网盘,网络上的赚钱神器【Yunfile网盘】,注册就送8元
YunFile.com,是提供在线存储和文件保存服务最大的网站之一,从2007年创立至今,我们提供免费的和您可以承受的收费服务.这些服务包括高级在线存储/远程备份服务,和先进的上传和下载工具.上百万来 ...
- 拦截js方法备忘录
很明显,以下代码拦截了fusion2.dialog.invite,然后在页面执行fusion2.dialog.invite方法的时候修改了参数中的img. <script> var old ...
- 写了一个基于React+Redux的仿Github进度条
曾经实现过Angular版,这次感觉用了高大上的React却写了更多的代码,需要的配置也更多了,有利有弊吧. 但这个“导航条问题”很有意思,涉及到在Redux中写timer,其实我很困惑,到底如何完美 ...