深入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 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事件。
相关文章
- SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
- SQL Server账号密码(sa)登录失败 错误原因:18456
- 【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
- centos8(linux):源码编译安装redis7(Redis server v=7.0.5)
- Django源码分析之server
- eureka源码:EurekaTransport类用于client与server进行交互
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
- SQL Server 2008 R2 安装时提示“Reporting Services目录数据库文件存在”
- OpenStack Swift源码初探--proxy下的server.py
- SQL SERVER服务器链接连接(即sql server的跨库连接)
- Angular platform-server.js 里动态创建 JavaScript 标签页的场景
- 实践案例丨云连接CC实现跨区域多VPC与线下IDC Server互联
- MySQL和SQL Server一些基本用法区别
- webrtc+turn+peerconnection_server测延时
- 安装CDH6.3版本的时候遇到 ‘ERROR main:com.cloudera.server.cmf.Main: Server failed’的解决方案
- Zabbix之YUM安装zabbix-server
- Android开发 客户端与C#服务器的连接+OkHttp+SQL Server
- ubuntu server 20.04安装vncserver