2015-10-10 3 views
4

Я пытаюсь создать процесс GenEvent с определенным именем (для этого вопроса я собираюсь с {:global, :x}). Если я обычно создаю GenEvent, например, GenEvent.start_link([name: {:global, :x}]), я могу получить доступ к GenEvent под этим именем. Это хорошо. Но я также хочу создать GenEvent под деревом надзора. Чтобы сделать это, я поставил генвента в спецификацию Supervision.Spec worker, и именно тогда все взорвалось.OTP: Запустить GenEvent под супервизором с именем

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}}} 

Что я делаю неправильно?

ответ

2

(Этот ответ приходит от asonge в #elixir на irc.freenode.net. Спасибо!)

args значение функции Supervisor.Spec.worker принимает список аргументов, передаваемых в функцию. Для GenEvent.start_link\1 требуется один аргумент, являющийся списком. Таким образом, мне нужно передать список, содержащий один элемент (массив args - start_link), который является списком, который нужен start_link. Таким образом, звонок worker составляет Supervisor.Spec.worker(GenEvent, [[name: {:global, :x}]], []).

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