OTP:在Supervisor With Name下启动GenEvent

时间:2015-10-10 03:49:35

标签: elixir otp

我正在尝试创建一个具有特定名称的GenEvent进程(对于这个问题,我将使用{:global, :x})。如果我正常创建GenEvent,例如GenEvent.start_link([name: {:global, :x}]),我可以以该名称访问GenEvent。非常好。但我也想在监督树下创建GenEvent。要做到这一点,我把genevent放到了监督。worker规范中,当事情爆发时就是这样。

iex(1)> {:ok, sup} = Supervisor.start_link([], strategy: :one_for_one)
{:ok, #PID<0.127.0>}
iex(2)> Supervisor.start_child(sup, Supervisor.Spec.worker(GenEvent, [name: {:global, :x}], []))
{:error,
 {{:EXIT,                                                                                                                                                                                    
   {:function_clause,                                                                                                                                                                        
    [{GenEvent, :start_link, [name: {:global, :x}],                                                                                                                                          
      [file: 'lib/gen_event.ex', line: 358]},                                                                                                                                                
     {:supervisor, :do_start_child, 2, [file: 'supervisor.erl', line: 343]},                                                                                                                 
     {:supervisor, :handle_start_child, 2, [file: 'supervisor.erl', line: 715]},                                                                                                             
     {:supervisor, :handle_call, 3, [file: 'supervisor.erl', line: 400]},                                                                                                                    
     {:gen_server, :try_handle_call, 4, [file: 'gen_server.erl', line: 629]},                                                                                                                
     {:gen_server, :handle_msg, 5, [file: 'gen_server.erl', line: 661]},
     {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 239]}]}},
  {:child, :undefined, GenEvent, {GenEvent, :start_link, [name: {:global, :x}]},
   :permanent, 5000, :worker, :dynamic}}}

我做错了什么?

1 个答案:

答案 0 :(得分:2)

(此答案来自asonge #elixir的{​​{1}}。谢谢!)

irc.freenode.net函数的args值采用传递给函数的参数列表。对于Supervisor.Spec.worker,它只需要一个列表参数。因此,我需要传递一个包含一个元素的列表(args数组到GenEvent.start_link\1),这是start_link所需的列表。因此,对start_link的调用是worker