2017-02-07 34 views
0

我想用一個:臨時重啓策略來監督一個任務,以便只有當它異常退出時纔會重啓。然而,當我測試我的應用程序時,我發現它在重新啓動之前4次重啓,直到主管自行解決問題。我簡化了代碼,甚至將重新啓動改爲:臨時,但即使如此,管理員仍在重新啓動任務。Elixir主管意外重啓一個臨時/臨時工作者

簡單的例子:

defmodule FooSup do 
    use Supervisor 

    def start_link() do 
    IO.puts "starting #{__MODULE__}" 
    Supervisor.start_link(__MODULE__, {}) 
    end 

    def init(_)do 
    children = [worker(Task, [fn -> IO.puts("task running") end])] 
    supervise(children, strategy: :one_for_one, restart: :temporary) 
    end 
end 

當我開始FooSup過程中,我得到以下輸出:

iex(2)> FooSup.start_link() 
starting Elixir.FooSup 
task running 
{:ok, #PID<0.215.0>} 
task running 
task running 
task running 

順便說一句,我知道,如果我想動態監督:臨時任務,我可以使用TaskSupervisor,但我希望靜態監督:transient。

已經使用Elixir開啓和關閉幾年,但看不到這裏有什麼問題。

+0

不應該'重新啓動::臨時'是'工人'而不是'監督'的選項?根據:https://hexdocs.pm/elixir/Supervisor.html#module-simple-one-for-one –

回答

2

我剛剛檢查本地和restart應該是一個選項,worker代替supervise,所以它應該是這樣的:

defmodule FooSup do 
    use Supervisor 

    def start_link() do 
    IO.puts "starting #{__MODULE__}" 
    Supervisor.start_link(__MODULE__, {}) 
    end 

    def init(_)do 
    children = [worker(Task, [fn -> IO.puts("task running") end], restart: :temporary)] 
    supervise(children, strategy: :one_for_one) 
    end 
end 

更可以在這裏找到:https://hexdocs.pm/elixir/Supervisor.html#module-simple-one-for-one

好運!