2013-02-23 9 views
2

OTP와 같은 수퍼바이저에서 내 머리를 쓰려고합니다. (엘릭서를 사용하고 있지만) 주 수퍼바이저 트리가 아닌 이유를 알 수 없습니다. 스타트.수퍼바이저가 일할 수 없습니다.

나는 하나의 청취자 작업자와 함께 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의 값은 1이 아니라 0이어야합니다.