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