【问题标题】:Cowboy on Erlang crashes on shutdownErlang 上的 Cowboy 在关机时崩溃
【发布时间】:2015-03-04 15:14:36
【问题描述】:

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

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

如果我关闭 erlang 虚拟机,我会得到:

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

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

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

【问题讨论】:

    标签: erlang erlang-supervisor cowboy lager


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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]}}.
      

      【讨论】:

        猜你喜欢
        • 2018-02-09
        • 2018-04-24
        • 2013-10-22
        • 2021-08-09
        • 2015-12-06
        • 2011-02-16
        • 2016-03-18
        • 2019-07-10
        • 2012-10-10
        相关资源
        最近更新 更多