新的Erlang和只是有點麻煩讓我的頭圍繞新的範式!erlang主管最好的方式來處理ibrowse:send_req conn_failed
OK,所以我有一個OTP gen_server在這個內部函數:
my_func() ->
Result = ibrowse:send_req(?ROOTPAGE,[{"User-Agent",?USERAGENT}],get),
case Result of
{ok, "200", _, Xml} -> %<<do some stuff that won't interest you>>
,ok;
{error,{conn_failed,{error,nxdomain}}} -> <<what the heck do I do here?>>
end.
如果我離開了的情況下處理,然後失敗,我得到傳播到主管的退出信號的連接,它被關閉與服務器一起。
我想要發生的事情(至少我認爲這是我想要發生的事情)是,在連接失敗時,我想暫停,然後重試send_req說10次,那時管理員可能會失敗。
如果我做了什麼醜像這樣...
{error,{conn_failed,{error,nxdomain}}} -> stop()
它關閉服務器進程,是的,我明白,直到它不能用我的(嘗試在10秒內10次)重啓戰略,也是期望的結果,但是當我真的想返回{error,error_but_please_dont_fall_over_mr_supervisor}時,從服務器到管理員的返回值是'ok'。
我強烈懷疑在這種情況下,我應該處理所有的業務內容,比如在'my_func'中重試失敗的連接,而不是試圖讓流程停止,然後讓管理員重新啓動它以便嘗試再次。
問題:在這種情況下,「Erlang方式」是什麼?
是的,我嘗試了一些類似的東西(比你的解決方案略差一些),傳遞嘗試的次數然後遞減並測試爲零。唯一的區別是我調用stop()而不是返回一個元組,停止會關閉服務器(並重新啓動它),但不會返回有用的消息,{error,too_many_retries}將返回一條有用的消息,但不會關閉服務器。 – unclejimbob
我希望找到一個解決方案來獲得這兩個世界的組合,因爲send_req錯誤出現我重試了10次,然後如果它仍然失敗,我抓住它,然後再次拋出,但以避免導致監督員失敗 - 但我也認爲這不是'Erlang的方式'。我認爲你的解決方案是要走的路,因爲如果發生任何其他異常,它應該由主管的重啓戰略覆蓋。 如果其他人有不同的方法或意見,那麼一定要通過。 非常感謝 – unclejimbob
@unclejimbob從我所瞭解的情況來看,只有在達到最大嘗試次數時,纔想讓監督人員失敗,對嗎?然後讓監督員重新啓動工作人員,以便從頂部重試整個操作。這是我試圖用代碼做的事情。你可能想用erlang來補充它:error(too_many_attempts)。所以,只有在達到最大嘗試或拋出未知錯誤(未捕獲)時,纔會「讓它崩潰」。我不喜歡定時器:sleep()是你的工作人員不服從sys消息,所以另一種解決方案是接收超時 – marcelog