Я пытаюсь раздобыть голову над супервизорами в 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
Что-то об определении супервизора в дереве не так, и я не могу понять, что, и это, кажется, в основном единственное, что сдерживает мой проект обратно.
Спасибо за любую помощь!