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

上一篇: erlang supervisor best way to handle ibrowse:send

下一篇: erlang supervisor restart strategy