Ковбой на Эрланге вылетает при выключении

Я получаю много ошибок при отключении моего 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 (,)

Другие вопросы по тегам