1

以下のコードを使用して、inets を使用して外部サイトに多数の http 呼び出しを行う Erlang アプリがあります。

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 が [Response] を返す可能性があるものを処理するための明示的なブロックがあります。それにもかかわらず、コンソールにダンプされた 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}}}}
4

4 に答える 4

1

作成する http 要求ごとに、個別の httpc_handler プロセスが「内部で」生成されます。このプロセスは、最初に目的のドメインへのソケットを開こうとします。この場合、ドメインが存在しないため、ソケットを開くことができません。その結果、生成されたプロセスは停止することを決定します。

ハンドラー プロセスは gen_server の原則に従って記述されているため、エラー ハンドラーは死にかけているプロセスの最後の状態をフラッシュします。これについてあなたができること、またはすべきことは何もありません。

于 2010-04-24T08:02:45.930 に答える
0

アプリがOTPの形式に従っていると仮定すると、inetsプロセスを処理するスーパーバイザーは、プロセスを再開するように構成可能である必要があります。クラッシュプロセスはerlangアプリでは「正常」であり、スーパーバイザーツリーにはさまざまな方法でその機会を処理できます。

Lukasは、SASLがプロセスがクラッシュしたという事実を報告しているだけであるという点で正しかった。これにより、コールバックが呼び出されるのを防ぎ、クラッシュを処理できなくなります。実際、クラッシュしたプロセスから呼び出されることに特に依存しているため、クラッシュを処理できません。

inetsプロセスがどのように開始され、呼び出しを行うコードがわからない場合、クラッシュを処理する適切な場所はスーパーバイザーツリーにあると言う以外にアドバイスするのは難しいです。Erlangシステムデザインのドキュメント(http://www.erlang.org/doc/design_principles/users_guide.html )を読んで、 erlangプロセスの使用方法と処理方法を理解することをお勧めします。

于 2010-04-25T01:09:00.317 に答える
0

http は、nxdomain で停止する新しいプロセスを作成すると思います。このクラッシュ sasl は、シェルでピックアップして出力します。

于 2010-04-24T11:49:36.657 に答える
0

inets HTTP クライアントのインターフェースはかなり一貫性がありません。代わりにlhttpcを使用することをお勧めします。

于 2010-04-26T12:30:21.420 に答える