0

在关闭与我的牛仔处理程序相关的 Erlang vm 时,我遇到了很多错误。我有一个 simple_one_for_one 主管,它运行 start_listeners() 函数,该函数运行 cowboy:start_http()。

一切都开始了,没有错误,正常处理请求。

如果我关闭 erlang VM,我会得到:

[错误] 主管 bitter_rpc_sup 有子 bitter_rpc_http_id 在未定义退出时以 bitter_rpc_sup:start_listeners() 开始,原因在上下文 shutdown_error 中被杀死

还有一堆与牛仔进程相关的其他错误被杀死并异常终止。牛仔不遵循 OTP 约定关闭吗?有没有办法让我拦截主管的关闭并手动关闭所有牛仔进程/牧场池?

我应该在哪里尝试解决这个错误?

4

2 回答 2

1

您可以创建牧场孩子并将其添加到您的主管中:

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]}}.
于 2015-01-09T19:28:55.243 回答
0

仔细查看包含的 Cowboy 示例,http 服务器没有直接监督,而是在 Cowboy 应用程序下运行。

所以我改变了我的 rpc 守护进程的主管,什么都不做:

init([]) ->
    Procs = [],
    {ok, {{one_for_one, 10, 10}, Procs}}.

并在主进程中实例化牛仔调度程序,从 start( , )返回空主管

于 2015-01-06T22:33:59.420 回答