Ковбой на Эрланге вылетает при выключении
Я получаю много ошибок при отключении моего Erlang vm, связанных с моими ковбойскими обработчиками. У меня есть супервизор simple_one_for_one, выполняющий функцию start_listeners(), которая выполняет ковбой:start_http().
Все запускается, ошибок нет, обрабатывает запросы нормально.
Если я выключаю Erlang VM, я получаю:
[ошибка] У супервизора bitter_rpc_sup был дочерний элемент bitter_rpc_http_id, запущенный с bitter_rpc_sup:start_listeners() при неопределенном выходе с причиной, уничтоженной в контексте shutdown_error
И куча других ошибок, связанных с тем, что ковбойские процессы были прерваны и ненормально завершены. Разве ковбой не следует соглашениям OTP для выключения? Могу ли я перехватить завершение работы в диспетчере и вручную отключить все процессы ковбойских систем / ранчо?
Где я должен искать, чтобы попытаться исправить эту ошибку?
2 ответа
Вы можете создать ребенка ранчо и добавить его в свой руководитель:
init([]) ->
%% define Ref, NbAcceptors, IP, Port, Dispatch
...
WebChild = ranch:child_spec(Ref,
NbAcceptors,
ranch_tcp,
[{ip, IP}, {port, Port}],
cowboy_protocol,
[{env, [{dispatch, Dispatch}]}]),
{ok, {{one_for_one, 10, 10}, [WebChild]}}.
Если внимательно посмотреть на включенные примеры Cowboy, http-сервер не контролируется напрямую, а работает под приложением Cowboy.
Поэтому я изменил супервизор для моего демона rpc, чтобы он ничего не делал:
init([]) ->
Procs = [],
{ok, {{one_for_one, 10, 10}, Procs}}.
и создал экземпляр диспетчера ковбоя в главном процессе, возвращая пустой супервизор из start (,)