一、目的
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的方法等。