关注LAMP|PHP源代码分析|web架构|PHP扩展|Erlang|服务端架构
2009年12月31日Erlang

0 Comments

rabbitmq代码摘录(1)

 

诸多erlang应用都是基于erlang现有的一些applicationrabbitmq也不例外,在rabbitmq中,需要的applicationsaslos_monmnesia。而rabbitmq启动这些application(包括其自身)的代码写的相当的巧妙:(源码基于rabbitmq 1.7.0

文件 rabbit.erl

-define(APPS, [os_mon, mnesia, rabbit]).

start() ->

    try

        ok = prepare(),

        ok = rabbit_misc:start_applications(?APPS

    after

        %%give the error loggers some time to catch up

        timer:sleep(100)

    end.

stop() ->

    ok = rabbit_misc:stop_applications(?APPS).

文件 rabbit_misc.erl

manage_applications(IterateDoUndoSkipErrorErrorTagApps) ->

    Iterate(fun (AppAcc) ->

                    case Do(Appof

                        ok -> [App | Acc];

                        {error, {SkipError_}} -> Acc;

                        {error, Reason} ->

                            lists:foreach(UndoAcc),

                            throw({error, {ErrorTagAppReason}})

                    end

            end, [], Apps),

    ok.

start_applications(Apps) ->

    manage_applications(fun lists:foldl/3,

                        fun application:start/1,

                        fun application:stop/1,

                        already_started,

                        cannot_start_application,

                        Apps).

stop_applications(Apps) ->

    manage_applications(fun lists:foldr/3,

                        fun application:stop/1,

                        fun application:start/1,

                        not_started,

                        cannot_stop_application,

                        Apps).

顺序启动或者关闭几个application,在失败的情况下首先判断操作失败的原因,如果是已经启动或者已经停止,则跳过;如果是启动失败或者停止失败,则先依次停止或者启动之前已经操作成功的application,之后抛出异常结束进程。

返回顶部