zl程序教程

您现在的位置是:首页 >  后端

当前栏目

深入Jetty源码之Server和Container

server源码 深入 container Jetty
2023-09-14 08:59:40 时间

概述

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事件。