erlang主管处理ibrowse的最佳方式:发送
对Erlang来说是新的东西,并且让我的头脑在这个新范例中遇到一些麻烦!
好的,所以我在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}。
在这种情况下,我强烈怀疑我应该处理所有业务内容,例如在'my_func'中重试失败的连接,而不是试图让流程停止,然后让主管重新启动它以便再次尝试。
问题:在这种情况下,“Erlang方式”是什么?
我也是新来的erlang ..但是这样的事情呢?
代码很长只是因为评论。 我的解决方案(我希望我已经正确理解你的问题)将获得最大尝试次数,然后执行尾递归调用,该调用将通过与下一次尝试的最大尝试次数进行模式匹配来停止。 使用timer:sleep()来暂停以简化事情。
%% @doc Instead of having my_func/0, you have
%% my_func/1, so we can "inject" the max number of
%% attempts. This one will call your tail-recursive
%% one
my_func(MaxAttempts) ->
my_func(MaxAttempts, 0).
%% @doc This one will match when the maximum number
%% of attempts have been reached, terminates the
%% tail recursion.
my_func(MaxAttempts, MaxAttempts) ->
{error, too_many_retries};
%% @doc Here's where we do the work, by having
%% an accumulator that is incremented with each
%% failed attempt.
my_func(MaxAttempts, Counter) ->
io:format("Attempt #~B~n", [Counter]),
% Simulating the error here.
Result = {error,{conn_failed,{error,nxdomain}}},
case Result of
{ok, "200", _, Xml} -> ok;
{error,{conn_failed,{error,nxdomain}}} ->
% Wait, then tail-recursive call.
timer:sleep(1000),
my_func(MaxAttempts, Counter + 1)
end.
编辑:如果这个代码是在一个被监督的过程中,我认为最好有一个simple_one_for_one,在那里你可以添加任何你需要的工作,这是为了避免由于超时而延迟初始化(在one_for_one工作人员开始顺序,并在此时进入睡眠状态将停止其他进程的初始化)。
编辑2:添加了一个示例shell执行:
1> c(my_func).
my_func.erl:26: Warning: variable 'Xml' is unused
{ok,my_func}
2> my_func:my_func(5).
Attempt #0
Attempt #1
Attempt #2
Attempt #3
Attempt #4
{error,too_many_retries}
每个打印的信息之间有1秒延迟。
链接地址: http://www.djcxy.com/p/6507.html