У меня есть init
функция gen_server, которую я подключаю к rabbitmq. Когда все в порядке, он работает отлично, однако при сбое подключения к rabbitmq и я вызываю exit
процесс не перезапускается.
Я хочу, чтобы супервизор перезапустил этот процесс после того, как я позвоню exit
.
Концептуально моя функция init
выглядит так:
init(_Args) ->
process_flag(trap_exit, true),
case connect() of
{error, econnrefused} ->
timer:sleep(1000),
exit(econnrefused);
{ok, Connection} ->
.....
end,
{ok, {}}.
А вот и мой руководитель:
-module(tasks_manager_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) ->
{ok,
{#{strategy => one_for_one,
intensity => 50,
period => 10},
[#{id => tasks_manager_serv_id,
start => {tasks_manager_serv, start_link, []},
restart => permanent,
shutdown => brutal_kill,
type => worker,
modules => [tasks_manager_serv]}]}}.
Ошибка, которую я получил, выглядит следующим образом. Вы можете видеть, что по этой ошибке нет перезапусков, она просто завершается:
Starting {global,tasks_da_serv} (<0.479.0>)
Starting {global,tasks_manager_serv} (<0.483.0>)
=INFO REPORT==== 9-Jun-2017::09:52:46 ===
application: tasks
exited: {{shutdown,
{failed_to_start_child,tasks_manager_sup_id,
{shutdown,
{failed_to_start_child,tasks_manager_serv_id,
econnrefused}}}},
{tasks_app,start,[normal,[]]}}
type: permanent
{"Kernel pid terminated",application_controller,"{application_start_failure,tasks,{{shutdown,{failed_to_start_child,tasks_manager_sup_id,{shutdown,{failed_to_start_child,tasks_manager_serv_id,econnrefused}}}},{tasks_app,start,[normal,[]]}}}"}
Kernel pid terminated (application_controller) ({application_start_failure,tasks,{{shutdown,{failed_to_start_child,tasks_manager_sup_id,{shutdown,{failed_to_start_child,tasks_manager_serv_id,econnrefu
Я также пробовал передать сообщение в self()
(из функции init
) и подключиться к кролику в handle_cast
, но это тоже не работает.
Я все еще изучаю Erlang / OTP, так что простите меня, если я спрашиваю о чем-то очевидном, но я не смог найти в документации ответа на свою проблему.
init
. Он перезапустит его для меня, если я добавлюself() ! connect
, а затем выйду черезhandle_info(connect, ...)
. - person Dogbert   schedule 09.06.2017supervisor
, который не начинается в вопросе OP, аgen_server
, который запускается им. - person juan.facorro   schedule 10.06.2017init/1
попытки подключиться несколько раз, прежде чем окончательно сдаться. Если супервизор запускает других дочерних элементов, которые ожидают, что средство rabbitmq будет доступно, то это, вероятно, лучше, чем позволить ему запускаться и асинхронно пытаться подключиться ... Вам действительно нужно повторить попытку? Если вы подключаетесь без повторной попытки, все приложение затем относительно быстро выходит из строя из-за недоступности внешнего ресурса, и это ясно для администраторов, которые могут с этим справиться. - person Michael   schedule 11.06.2017