OTP: запустить GenEvent под супервизором с именем

Я пытаюсь создать процесс GenEvent с определенным именем (для этого вопроса я использую {:global, :x}). Если я обычно создаю GenEvent, например. GenEvent.start_link([name: {:global, :x}]), я могу получить доступ к GenEvent по этому имени. Это хорошо. Но я также хочу создать GenEvent под деревом наблюдения. Для этого я поместил genevent в спецификацию Supervision.Spec 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}}}

Что я делаю не так?


person Havvy    schedule 10.10.2015    source источник


Ответы (1)


(Этот ответ исходит от 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}]], []).

person Havvy    schedule 10.10.2015