因為學習erlang,下載了傳說中的rabbitmq,這個是工業級,學習一下還是有必要的。看看大師們如何用erlang,:http://www.rabbitmq.com/server.html。
解壓後工程很整齊:
先分析啟動進入點,環境為win7,其實對程式進入點我一直不太瞭解,感覺erlang程式的進入點沒有固定的,雖然可以通過檔案中的一些東西來分析出來,感覺不方便。
開啟ebin目錄下發現了一個rabbit_app.in檔案,這個就是rabbitmq的應用檔案了。 {mod, {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)展開宏為rabbit_misc:start_applications([os_mon, mnesia, rabbit]);
上代碼:
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.
start_applications(Apps) ->
manage_applications(fun lists:foldl/3,
fun application:start/1,
fun application:stop/1,
already_started,
cannot_start_application,
Apps).
原來application:start在這等著呢。這樣就啟動了這三個模組。
啟動rabbit時調用模組中的start/2方法,上代碼:
start(normal, []) ->
case erts_version_check() of
ok ->
{ok, SupPid} = rabbit_sup:start_link(),
true = register(rabbit, self()),
print_banner(),
[ok = run_boot_step(Step) || Step <- boot_steps()],
io:format("~nbroker running~n"),
{ok, SupPid};
Error ->
Error
end.
首先檢查erlang版本,這裡面用到列表解析,充分發揮了erlang的模式比對。如果版本不低於系統要求的則返回ok,此時調用監督樹rabbit_sup:start_link/0方法啟動監督樹。開啟監督樹模組,
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/yuanhailu01/archive/2011/04/06/6305261.aspx