0

我有一个由 erl_call 触发的 erlang 服务。erl_call 将进行一个长调用,例如 "gen_server:call(?SERVER, do, infinity)" 以等待结果。如果 erlang 服务关闭,则 erl_call 将返回。但是如果 erl_call 被中断(使用 CTRL-C),erlang 服务不会收到任何消息。

我检查了 appmon 和 pman。erl_call 启动的进程在 erl_call 断开后不会死掉。所以链接/监控到那个过程是行不通的。如何检测 erl_call 已断开连接?

4

1 回答 1

0

在您的 handle_call 函数中有第二个。参数来自 :: {pid(), tag()}

您可以在处理请求之前在handle_call 中调用monitor(process, FromPid),以便在您的erl_call 节点断开连接时收到DOWN 消息。但请注意,除非您生成一个单独的进程或使用带有 gen_server:reply() 的延迟回复,否则您将无法在当前的 handle_call 完成之前处理 DOWN 消息。

例如:这是我们的 handle_call 子句:

handle_call(test, {From, _}=X, State) ->
    erlang:monitor(process, From),

    spawn(fun() ->
       timer:sleep(10000),
       io:format("### DONE~n", []),
       gen_server:reply(X, ok) end),

    {noreply, State}.

接下来我们赶上DOWN:

handle_info(Info, State) ->
    io:format("### Process died ~p~n", [Info]),
    {noreply, State}.

接下来我从命令行生成 erl_call: erl_call -c 123 -n test -a 'gen_server call [a, test, infinity]'

然后按 Ctrl-C

10 秒后在 gen_server 控制台中,我看到:

### DONE            
### Process died {'DOWN',#Ref<0.0.0.41>,process,<0.44.0>,normal}
于 2012-11-15T12:18:28.337 回答