我們有一些服務需要一段時間才能開始(1-2分鐘)。在此過程中,有人可能會要求強制關閉服務(即轉換STARTING -> STOPPING
)。查看AbstractService類的來源,我發現噹噹前狀態爲STARTING
或NEW
時,沒有呼叫doStop()
,這意味着在收到停止請求時不會通知基礎類。番石榴服務停止狀態正在啓動
switch (snapshot.state) {
case NEW:
snapshot = new StateSnapshot(State.TERMINATED);
terminated(State.NEW);
break;
case STARTING:
snapshot = new StateSnapshot(State.STARTING, true, null);
stopping(State.STARTING);
break;
case RUNNING:
snapshot = new StateSnapshot(State.STOPPING);
stopping(State.RUNNING);
doStop();
break;
case STOPPING:
case TERMINATED:
case FAILED:
// do nothing
break;
default:
throw new AssertionError("Unexpected state: " + snapshot.state);
}
因爲我需要無論狀態來執行一些清理工作,有沒有收到通知的關機的方法嗎?在子類中使用Service.Listener是個好主意嗎?
哎呦。只要我發佈,我意識到你說,底層類沒有通知,因爲'doStop'沒有被調用。所以我想我的答案可能基本上就是我答案的第二段。 :-) –
你可以編輯你的答案,並刪除第一段 –
是的,但我覺得那裏還有一些有用的信息。 –