2013-02-23 2 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

Я понял, почему у него была подгонка, пытаясь добавить его динамически. Оказывается, arity для HTTPServer.HandlerSupervisor.start_link должен быть 0, а не 1.

Смежные вопросы