深入Jetty源码之Server和Container

概述

Server类是Jetty中最核心的是类,它即包含Connectors数据,有包含了Handler的集合,即它是Jetty中用于连接Connector和Handler的类。同时它还包含了一个Container,用于存储Jetty中核心类实例的关系发生变化时触发事件的Listener,接收者可以注册一个Listener以获取Jetty中某个类的关系发生变化。
Server的实现

Server继承自HandlerWrapper,因而它默认是一个Handler容器,另外它也包含一个Container字段,以及Connector数组字段,ThreadPool字段,另外它还包含了一些配置字段,如:attributes、sessionIdManager、sendServerVersion、sendDateHeader、stopAtShutdown(注册shutdown hook)、maxCookieVersion、dumpAfterStart、dumpBeforeStop等,这些只是用于配置信息,而且名称本身已经很清楚它的含义了。

 

在使用Server时,我们需要向其添加Connector以及Handler,从而在启动时,它会首先注册ShutdownThread,即在JVM退出时会首先调用它的stop方法;如果没有手动设置ThreadPool,使用QueuedThreadPool初始化ThreadPool字段;然后启动所有Handler以及Connector。在stop时,它先close所有Connector,然后设置所有实现了Graceful接口的类的shutdown为true,并等待graceful时间后,stop所有Connector以及Handler。

 

Server中有两个handle方法在HttpConnection请求解析完成后调用,其中handle方法用于在非ASYNC状态下的调用,它只是从HttpConnection中取得Request、Response实例以及PathInfo作为target,传递给Handler的handle方法;而handleAsync方法则是在ASYNC状态下调用,它的baseRequest从HttpConnection中获取,但是会将其原有的RequestURI、QueryString、ContextPath设置到其Attribute(javax.servlet.async.*)中,而将他们对应的属性包括PathInfo更新为当前AsyncContext中Request的值,并且request、response实例则是从AsyncContext中获取,然后调用Handler的handle方法。

Container的实现

Container用于生成父实例和子引用的关系发生变化时生成的时间,以提供其注册的Listener接收到相应的事件。Container通过内部接口Listener可以触发如下事件:

     public  interface Listener  extends EventListener {
         public  void addBean(Object bean);
         public  void removeBean(Object bean);
         public  void add(Container.Relationship relationship);
         public  void remove(Container.Relationship relationship);
    }

其中Relationship表示一个父实例和一个子引用的关系,如handler、threadPool、errorHandler等。每当一个关系发生变化时,可以调用Container的update方法,而update方法内部会触发相应的remove和add事件。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值