当我停止我构建的 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 是在牛仔应用程序下运行的吗?我想是的。
- 如果是这样,我该如何阻止它?
- 而且,我应该担心停止它吗?也许这没什么大不了的。
提前致谢!