天天看點

Hadoop Common源碼分析之服務Service

        Service是定義Hadoop中服務生命周期的一個接口。Service内部定義了服務的狀态及生命周期,在服務被構造後,其一個生命周期内的狀态為NOTINITED未初始化--INITED已初始化--已啟動STARTED--已停止STOPPED,而這一生命周期内服務狀态的變化,是随着如下方法鍊的調用而變化的:init()--start()--stop(),服務構造後整體方法調用及狀态轉移如下圖所示:

Hadoop Common源碼分析之服務Service

        下面,我們來看下Service的源碼分析,先看下其内部定義的服務狀态,如下:

        STATE是一個枚舉類,代表了服務生命周期内各階段的狀态,分别為:

        1、NOTINITED--0:服務執行個體已經構造但是還沒有初始化;

        2、INITED--1:服務執行個體已經初始化但還沒有啟動或停止;

        3、STARTED--2:服務執行個體已經啟動但沒有停止;

        4、STOPPED--3:服務執行個體已經停止,不允許進一步的狀态轉換。

        接下來,我們再看下導緻服務狀态變更的各個方法,如下:

        1、初始化服務init(): NOTINITED-->INITED/STOPPED

        初始化後,服務狀态由NOTINITED轉換到INITED,除非異常發生導緻服務初始化操作失敗,在這種情況下,stop()方法應該被調用,并且服務狀态進入STOPPED。

        2、啟動服務start():INITED-->STARTED/STOPPED

        服務啟動後,服務狀态由INITED轉換到STARTED,除非異常發生導緻服務啟動操作失敗,在這種情況下,stop()方法應該被調用,并且服務狀态進入STOPPED。

        3、停止服務stop():NOTINITED/INITED/STARTED-->STOPPED

        停止服務。如果服務已經處于STOPPED狀态,這必須是一個空操作。它應該盡力試圖停止服務的所有部分。實作者必須被設計為完成這個操作,而不管服務的狀态,包括其内部所有字段初始化/未初始化的狀态。

        為了兼顧Java7閉包條款,Service接口還提供了close()方法,實際上就是調用stop()方法,代碼如下:

        Service的另外一大塊内容,就是對于服務狀态變更時間的監聽,并提供了注冊監聽器與登出監聽器的方法,如下:

        1、注冊監聽器registerServiceListener()

        2、登出監聽器unregisterServiceListener()

        還有,Service還提供了擷取服務失敗時發生的第一個異常和當時狀态的方法,如下:

        既然是一個服務,Service還提供了阻塞等待服務停止的waitForServiceToStop()方法,如下:

        其它諸如擷取服務名、擷取目前服務狀态、擷取服務啟動時間、查詢是否服務是在一個特定的狀态、擷取生命周期曆史的一個快照、擷取遠端依賴服務的正在停止服務的阻塞者等方法不再一一介紹,讀者可自行查詢,下面隻把代碼貼出:

繼續閱讀