2010-04-24 94 views
0

我有一個Erlang的應用程序,這使得大量HTTP調用使用inets外部網站,使用下面處理二郎inets HTTP客戶端錯誤

case http:request(get, {Url, []}, [{autoredirect, false}], []) of 
{ok, {{_, Code, _}, _, Body}}-> 
    case Code of 
    200 -> 
     HandlerFn(Body); 
    _ -> 
     {error, io:format("~s returned HTTP ~p", [Broker, Code])} 
    end; 
Response -> %% block to handle unexpected responses from inets 
    {error, io:format("~s returned ~p", [Broker, Response])} 
end. 

的代碼有一個明確的塊來處理什麼奇怪inets可能返回[響應]。儘管如此,我仍然可以看到inets錯誤報告轉儲到控制檯[下面的示例]。我在這裏做錯了什麼?我需要在別處配置某種類型的inets錯誤處理程序嗎?

謝謝。

-

=ERROR REPORT==== 24-Apr-2010::06:49:47 === 
** Generic server <0.6618.0> terminating 
** Last message in was {connect_and_send, 
          {request,#Ref<0.0.0.139358>,<0.6613.0>,0,http, 
           {"**********",80}, 
           "*****************************", 
           [],get, 
           {http_request_h,undefined,"keep-alive", 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,"news.bbc.co.uk", 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,[],undefined,undefined,undefined, 
            undefined,"0",undefined,undefined, 
            undefined,undefined,undefined,undefined,[]}, 
           {[],[]}, 
           {http_options,"HTTP/1.1",infinity,false,[], 
            undefined,false,infinity}, 
           "************************************", 
           [],none,[],1272088179114,undefined,undefined}} 
** When Server state == {state, 
          {request,#Ref<0.0.0.139358>,<0.6613.0>,0,http, 
           {"******************",80}, 
           "*****************************", 
           [],get, 
           {http_request_h,undefined,"keep-alive", 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,"news.bbc.co.uk", 
            undefined,undefined,undefined,undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,[],undefined,undefined, 
            undefined,undefined,"0",undefined, 
            undefined,undefined,undefined,undefined, 
            undefined,[]}, 
           {[],[]}, 
           {http_options,"HTTP/1.1",infinity,false,[], 
            undefined,false,infinity}, 
           "****************************************", 
           [],none,[],1272088179114,undefined,undefined}, 
          undefined,undefined,undefined,undefined,undefined, 
          {[],[]}, 
          {[],[]}, 
          undefined,[],nolimit,nolimit, 
          {options, 
           {undefined,[]}, 
           0,2,5,120000,2,disabled,false,inet,default, 
           default,[]}, 
          {timers,[],undefined}, 
          httpc_manager,undefined} 
** Reason for termination == 
** {error,{connect_failed,{#Ref<0.0.0.139358>,{error,nxdomain}}}} 

=ERROR REPORT==== 24-Apr-2010::06:49:47 === 
HTTPC-MANAGER<httpc_manager> handler (<0.6618.0>, started) failed to connect and/or send request #Ref<0.0.0.139358> 
    Result: {error,{connect_failed,{#Ref<0.0.0.139358>,{error,nxdomain}}}} 

回答

1

爲您做出每個HTTP請求,單獨httpc_handler進程產生 「內部」。 此過程首先嚐試打開所需域的套接字。在這種情況下,域不存在,因此打開套接字失敗。結果,產生的過程決定停止。

由於處理程序進程是根據gen_server原則編寫的,因此您的錯誤處理程序將刷新死亡進程的最後一個狀態。對此你沒有什麼可以或應該做的。

+0

嗯,這是一個間歇性的錯誤;所以這是遠程服務器的問題。問題是,我如何處理我的錯誤? – Justin 2010-04-24 08:19:25

+0

我認爲他的問題更多的是關於如何處理inets進程崩潰的事實,而不是爲什麼它崩潰。 – 2010-04-25 01:10:24

0

我猜想,http創建一個新的進程,死於nxdomain。這個崩潰sasl拿起並打印在外殼中。

0

假設您的應用程序遵循OTP格式,那麼處理inets過程的主管應該可配置爲重新啓動過程。 Erlang應用程序的崩潰過程是「正常的」,並且在主管樹中有各種方式來處理這種情況。

Lukas是正確的,SASL只是報告過程崩潰的事實。這可以防止你的回調被調用,所以它不能處理崩潰。事實上,它不能處理崩潰,因爲它特別是取決於被墜毀的進程調用。

沒有看到你的inets過程是如何啓動的以及調用該代碼的代碼很難告訴你,只是說你的主管樹中處理崩潰的正確位置。我建議閱讀Erlang系統設計文檔:http://www.erlang.org/doc/design_principles/users_guide.html以瞭解如何使用和處理erlang進程。

0

inets HTTP客戶端具有相當不一致的接口。我建議使用lhttpc代替。