2013-02-23 55 views
2

我想让我的头在OTP的主管和erlang这样的(虽然我使用灵丹妙药),我似乎无法弄清楚为什么主要的主管树不会开始。不能让主管工作

我正在一个HTTP服务器上有一个监听者工作者,而一个监督者有处理程序(动态启动)。我可以自己开始其中的每一个,如果侦听器是树中唯一的东西,我就可以启动树。

这里的主管定义的灵药

defmodule HTTPServer.Supervisor do 
    use Supervisor.Behaviour 

    def start_link(port) do 
    :supervisor.start_link({ :local, :sup }, __MODULE__, [port]) 
    end 

    def init(port) do 
    tree = [ 
     worker(HTTPServer.Listener, [port], id: :listener_sup), 
     supervisor(HTTPServer.HandlerSupervisor, [], shutdown: :infinity, 
                modules: []) 
    ] 
    supervise(tree, strategy: :one_for_one) 
    end 
end 

defmodule HTTPServer.HandlerSupervisor do 
    use Supervisor.Behaviour 

    def start_link(_) do 
    IO.puts "starting handler supervisor" 
    :supervisor.start_link({ :local, :handler_sup }, __MODULE__, []) 
    end 

    def init(_) do 
    tree = [ worker(HTTPServer.Handler, [], restart: :temporary, 
              id: nil) ] 
    supervise(tree, strategy: :simple_one_for_one) 
    end 

    def start_child([socket]) do 
    IO.puts "starting handler child" 
    :supervisor.start_child(:handler_sup, [socket]) 
    end 
end 

一些关于树的主管定义是错误的,我想不出什么,这似乎是基本上抱着我的项目回来的唯一的事情。

感谢您的帮助!

回答

0

我想通过试图动态添加它来解释它为什么适合。事实证明,HTTPServer.HandlerSupervisor.start_link的参数应该是0,而不是1.