处理Erlang会导致http客户端错误

时间:2010-04-24 06:28:46

标签: erlang inets

我有一个Erlang应用程序,它使用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可能会返回[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 个答案:

答案 0 :(得分:1)

对于您发出的每个http请求,会在“内部”生成单独的httpc_handler进程。 此过程首先尝试打开到所需域的套接字。在这种情况下,域不存在,因此打开套接字失败。结果,衍生过程决定停止。

由于处理程序进程是根据gen_server原则编写的,因此错误处理程序将刷新死亡进程的最后状态。你没有什么可以或应该做的。

答案 1 :(得分:0)

我猜想http会创建一个与nxdomain一起消亡的新进程。这个崩溃sasl拾取并打印在shell中。

答案 2 :(得分:0)

假设您的应用程序遵循OTP的格式,那么处理inets进程的主管应该可以配置为重新启动进程。对于erlang应用程序而言,崩溃进程是“正常的”,并且管理程序树中有各种各样的方法来处理这种情况。

Lukas说得对,SASL只是报告了这个过程崩溃的事实。这可以防止您的回调被调用,因此它无法处理崩溃。实际上它无法处理崩溃,因为它特意依赖被崩溃的进程调用。

没有看到你的inets进程是如何启动的以及调用的代码很难告诉你除了说你处理崩溃的正确位置在你的supervisor树中。我建议阅读Erlang系统设计文档:http://www.erlang.org/doc/design_principles/users_guide.html,以了解如何使用和处理erlang进程。

答案 3 :(得分:0)

inets HTTP客户端具有相当不一致的接口。我建议改为使用lhttpc