我有一个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.有一个显式的块来处理任何奇怪的inet可能返回的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}}}}发布于 2010-04-24 16:02:46
对于您发出的每个http请求,都会在“内部”产生一个单独的httpc_handler进程。此进程首先尝试打开通向所需域的套接字。在这种情况下,该域不存在,因此打开套接字失败。因此,衍生的进程决定停止。
因为处理程序进程是根据gen_server原则编写的,所以错误处理程序将刷新即将结束的进程的最后状态。对此你无能为力,也无能为力。
发布于 2010-04-24 19:49:37
我猜想http创建了一个新的进程,它以nxdomain结束。这个crash sasl可以在shell中拾取和打印。
发布于 2010-04-25 09:09:00
假设你的应用程序遵循OTP的格式,那么处理inets进程的主管应该是可配置的,以重新启动进程。对于erlang应用程序来说,进程崩溃是“正常的”,在supervisor树中有各种方法来处理这种情况。
Lukas是对的,SASL只是报告了进程崩溃的事实。这可以防止你的回调被调用,所以它不能处理崩溃。事实上,它不能处理崩溃,因为它特别依赖于崩溃的进程的调用。
如果看不到inets进程是如何启动的,也看不到进行调用的代码,就很难给出建议,就像说处理崩溃的合适位置在您的supervisor树中一样。我建议阅读Erlang系统设计文档:http://www.erlang.org/doc/design_principles/users_guide.html,以了解如何使用和处理erlang流程。
https://stackoverflow.com/questions/2703466
复制相似问题