1

当我停止我构建的 Erlang 应用程序时,牛仔侦听器进程保持活动状态,继续处理请求。在我编写的 gen_server 中,我在 init 上启动了一个服务器。如下所示:

init([Port]) ->
    Dispatch = cowboy_router:compile([
        {'_', [
                    {"/custom/[...]", ?MODULE, []},
                    % Serve index.html as default file
                    % Serve entire directory
                    {"/[...]", cowboy_static, {priv_dir,
                                               app, "www"}}
              ]}
        ]),
    Name = custom_name,
    {ok, Pid} = cowboy:start_http(Name, 100,
                  [{port, Port}],
                   [{env, [{dispatch, Dispatch}]}]),
    {ok, #state{handler_pid = Pid}}.

这将启动牛仔 http 服务器,它使用 cowboy_static 服务priv/app/目录中的一些内容,并使用当前模块来处理自定义内容(模块实现了所有牛仔 http 句柄回调)。它获取从调用返回的 pid 并将其分配给handler_pid状态记录。这一切都有效。但是,当我启动包含此模块(有效)的应用程序然后我停止它时。所有进程都结束(至少我的应用程序中的那些)。自定义处理程序(在与 gen_server 相同的模块中实现)不再起作用。但是 cowboy_static 句柄继续处理请求。它继续提供静态文件,直到我杀死节点。我尝试通过将其添加到 gen_server 来解决此问题:

terminate(_Reason, State) ->
    exit(State#state.handler_pid, normal),
    cowboy:stop_listener(listener_name()),
    ok.

但没有任何改变。cowboy_static 处理程序继续提供静态文件。

问题:

  • 我在这里做错什么了吗?
  • cowboy_static 是在牛仔应用程序下运行的吗?我想是的。
  • 如果是这样,我该如何阻止它?
  • 而且,我应该担心停止它吗?也许这没什么大不了的。

提前致谢!

4

2 回答 2

3

我认为这并不重要,通常每个应用程序使用一个节点/VM(实际上是一堆 erlang 应用程序一起工作,但我没有更好的词)。但我认为你可以使用停止服务器application:stop(cowboy), application:stop(ranch).

于 2014-08-22T19:27:43.320 回答
0

你应该修复三件事:

  • start_http(Name, ...)中的符号stop_listener(Name)应该匹配。
  • 服务初始化中的陷阱退出:process_flag(trap_exit, true)
  • exit从终止中删除呼叫。
于 2016-02-03T04:51:30.747 回答