Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150109
  • 博文数量: 92
  • 博客积分: 2035
  • 博客等级: 大尉
  • 技术积分: 874
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-10 09:03
文章分类

全部博文(92)

文章存档

2010年(38)

2009年(54)

我的朋友

分类:

2009-12-05 22:38:24

rabbitmq_server-1.7.0\sbin 目录的 rabbitmq-server.bat 最后看到
%ERLANG_HOME%\bin\erl.exe" ^
%RABBITMQ_EBIN_PATH% ^
-noinput ^
-boot %RABBITMQ_BOOT_FILE% %RABBITMQ_CONFIG_ARG% ^
-sname %RABBITMQ_NODENAME% ^
-s rabbit
 
-s rabbit 从rabbit模块启动 看rabbit.erl的  start()-> 函数

start() ->
    try
        ok = prepare(),
        ok = rabbit_misc:start_applications(?APPS)
    after
        %%give the error loggers some time to catch up
        timer:sleep(100)
    end.

prepare()准备环境 然后调用rabbit_misc:start_applications(?APPS) ?APPS此文件定义
-define(APPS, [os_mon, mnesia, rabbit]).
看看rabbit_misc:start_applications

start_applications(Apps) ->
    manage_applications(fun lists:foldl/3,
                        fun application:start/1,
                        fun application:stop/1,
                        already_started,
                        cannot_start_application,
                        Apps).

start_applications调用的是manage_applications 传递的参数是
                        fun lists:foldl/3,
                        fun application:start/1,
                        fun application:stop/1,
                        already_started,
                        cannot_start_application,
                        [os_mon, mnesia, rabbit]   ,这个比较精妙,仔细看看!分别对应到                  Iterate, Do, Undo, SkipError, ErrorTag, Apps

manage_applications(Iterate, Do, Undo, SkipError, ErrorTag, Apps) ->
    Iterate(fun (App, Acc) ->
                    case Do(App) of
                        ok -> [App | Acc];
                        {error, {SkipError, _}} -> Acc;
                        {error, Reason} ->
                            lists:foreach(Undo, Acc),
                            throw({error, {ErrorTag, App, Reason}})
                    end
            end, [], Apps),
    ok.

实际运行的manage_applications 是这样的

manage_applications(lists:foldl/3, application:start/1, application:stop, already_started, cannot_start_application, [os_mon, mnesia, rabbit]) ->
    lists:foldl(fun (os_mon, Acc) ->
                    case application:start(os_mon) of
                        ok -> [os_mon | Acc];
                        {error, {already_started, _}} -> Acc;
                        {error, Reason} ->
                            lists:foreach(application:stop, Acc),
                            throw({error, {cannot_start_application, os_mon, Reason}})
                    end
            end, [], [os_mon, mnesia, rabbit]),
    ok.  依次启动os_mon, mnesia, rabbit 
使用application:start(rabbit) 会调用rabbit:start()/2 回到rabbit.erl 见下一节



阅读(833) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~