Service是定義Hadoop中服務生命周期的一個接口。Service内部定義了服務的狀态及生命周期,在服務被構造後,其一個生命周期内的狀态為NOTINITED未初始化--INITED已初始化--已啟動STARTED--已停止STOPPED,而這一生命周期内服務狀态的變化,是随着如下方法鍊的調用而變化的:init()--start()--stop(),服務構造後整體方法調用及狀态轉移如下圖所示:
下面,我們來看下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()方法,如下:
其它諸如擷取服務名、擷取目前服務狀态、擷取服務啟動時間、查詢是否服務是在一個特定的狀态、擷取生命周期曆史的一個快照、擷取遠端依賴服務的正在停止服務的阻塞者等方法不再一一介紹,讀者可自行查詢,下面隻把代碼貼出: