我有一个由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已断开连接?
发布于 2012-11-15 20:18:28
在你的handle_call函数中有第二个。参数来自::{pid(),tag()}
您可以在处理请求之前调用handle_call中的monitor(process,FromPid),以便在erl_call节点断开连接时收到关闭消息。但请注意,除非您生成一个单独的进程或对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}.接下来,我们来了解一下:
handle_info(Info, State) ->
io:format("### Process died ~p~n", [Info]),
{noreply, State}.接下来,我从命令行生成测试: erl_call -c 123 -n -n -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}https://stackoverflow.com/questions/13394612
复制相似问题