2012-11-15 170 views
0

我有一個由erl_call觸發的erlang服務。 erl_call將會像「gen_server:call(?SERVER,do,infinity)」一樣進行長時間調用,以等待結果。如果erlang服務關閉,erl_call將返回。但是,如果erl_call被中斷(使用CTRL-C),erlang服務就不會收到任何消息。如何檢測erl_call斷開連接

我用appmon和pman檢查。在erl_call斷開連接後,erl_call開始的進程不會死亡。因此,鏈接/監視該進程不起作用。如何檢測erl_call已斷開連接?

回答

0

在你的handle_call函數中有第二個。參數來自:: {pid(),tag()}

在處理請求之前,您可以在handle_call中調用monitor(process,FromPid),以便在erl_call節點斷開連接時收到DOWN消息。但請注意,在當前handle_call完成之前,您將無法處理DOWN消息,除非您生成單獨的進程或使用gen_server:reply()的延遲迴復。

例如:這裏是我們的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:

接下來,我在命令行erl_call產卵: erl_call -c 123 -n測試-a「 gen_server呼叫[a,test,infinity]'

and hit Ctrl-C

在10秒後的gen_server控制檯我看到:

### DONE    
### Process died {'DOWN',#Ref<0.0.0.41>,process,<0.44.0>,normal} 
+0

嗨,謝謝你的回覆。我使用延遲迴復並保持erl_call等待。我嘗試鏈接/監視器。但它不起作用。用pman,我可以找出哪個進程正在等待結果。在中斷erl_call之後,進程仍然活着,所以我沒有收到任何EXIT/DOWN消息。 – shian

+0

那麼,當延遲的呼叫完成後,您最終會收到DOWN消息。我剛剛檢查過,確實有效。 – 2012-11-15 14:27:15

+0

我已經更新了答案 – 2012-11-15 14:33:52