无法让主管上班

时间:2013-02-23 12:38:49

标签: erlang otp elixir

我正试图让我的头脑在OTP和Erlang(尽管我使用的是elixir)中的主管,我似乎无法弄清楚为什么主监督树不会启动。

我正在使用一个侦听器工作者创建一个http服务器,并且一个主管具有处理程序(动态启动)。我可以自己开始每一个,如果监听器是树中唯一的东西,我可以启动树。

这是elixir中的主管定义

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

关于树中主管定义的一些内容是错误的,我无法弄清楚是什么,而且它似乎基本上是唯一让我的项目恢复的东西。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想通过尝试动态添加它来解决它的原因。事实证明,HTTP Server.Handler Supervisor.start_link的arity应该是0而不是1.