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 関数には 2 番目があります。引数 From :: {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 に答える