当我停止构建的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处理程序继续提供静态文件。
问题:
提前致谢!
答案 0 :(得分:3)
我不认为它非常重要,通常每个应用程序使用一个节点/ VM(实际上是一堆erlang应用程序一起工作,但我没有更好的词)。但我认为您可以使用application:stop(cowboy), application:stop(ranch).
答案 1 :(得分:0)
你应该解决3件事:
start_http(Name, ...)
和stop_listener(Name)
中的符号应匹配。process_flag(trap_exit, true)
exit
来电。