Supervisor 的監督的對象必須要有實踐 child_spec/1 函數來告訴 supervisor 如何啟動它。
好消息是,如果要監督的對象是 GenServer, Agent 或是另一個 Supervisor ,我們在使用時 use GenServer 會把預設的 child_spect 帶入,所以不需要另外建立
預設的 child_spect 類似:
def child_spec(arg)
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [arg]}
}
end
當 Supervisor 要啟動這個 child 時,會便呼叫 `Bank.start_link(100),因此我們使用之前的 tuple 寫法
children = [
{Bank, 100}
]
帶入這個函式時就變成完整的 child_spec
%{
id: Bank,
start: {Bank, :start_link, [100]}
}
另外除了 id 與 start 之外可以可選的調整的項目還有
%{
id: Bank,
start: {Bank, :start_link, [100]},
restart: :permanent,
shutdown: 5_000,
type: :worker
}
這個 process 的種類
:worker
:supervisor
告訴 supervisor 要怎麼關閉這個 child process
如果 type 為 worker,預設為 5000,如果 type 為 supervisor,預設則是 :infinity
可有的選項為:
brutal_kill 直接關閉:infinity
告訴 supervisor 這個 child process 的重新啟動行為
可有的選項為:
:permanent 正常重開,此為預設值:temporary 不管 supervisor 的設定,這個 child 不給重開:transient 只在意外發生時重啟,正常的關閉理由如 :normal, :shoutdown 或 {:shutdown, term} 不重開