什麼都別說,直接看啓動函數
start(normal, _Args)
%% ejabberd_logger主要是讀取application的配置文件,然後啓動lager,設置lager參數。
ejabberd_logger:start(),
%% 將本進程的pid寫入配置文件指定的文件名中
write_pid_file(),
%% 新建jid ets
jid:start(),
%% 啓動其它 app
start_apps(),
%% 查檢ejabberd需要的module是否都有,如果沒有,退出
ejabberd:check_app(ejabberd),
%% 空函數什麼都沒幹
randoms:start(),
%% 啓動mnesia
db_init(),
%% 啓動ejabberd進程,進程loop爲空
start(),
%% 讀取*.msg中的條目,將英文信息與翻譯後的信息存入translations的ets中,方便以後查詢
translate:start(),
%% 創建兩個ets用來存放命令
ejabberd_ctl:init(),
%% 新建ejabberd_commands的ets,然後插入兩條命令
ejabberd_commands:init(),
%% 插入命令到ejabberd_commands的ets中
ejabberd_admin:start(),
%% 創建名爲ejabberd_modules的ets
gen_mod:start(),
%%加入新的模塊文件路徑,註冊幾個查看模塊的命令到ejabberd_commands
ext_mod:start(),
%% 讀取配置文件,設置進程屬性
ejabberd_config:start(),
set_settings_from_config(),
acl:start(),
shaper:start(),
connect_nodes(),
Sup = ejabberd_sup:start_link(),
%% 連接其它結點
ejabberd_rdbms:start(),
ejabberd_riak_sup:start(),
ejabberd_sm:start(),
cyrsasl:start(),
% Profiling %
ejabberd_debug:eprof_start(),
%
ejabberd_debug:fprof_start(),
maybe_add_nameservers(),
ejabberd_auth:start(),
ejabberd_oauth:start(),
gen_mod:start_modules(),
ejabberd_listener:start_listeners(),
?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]), Sup;
%% 初始化數據庫
db_init() ->
ejabberd_config:env_binary_to_list(mnesia, dir),
MyNode = node(),
DbNodes = mnesia:system_info(db_nodes),
%% 如果自己這個結點不是數據庫結點中的一個報錯
case lists:member(MyNode, DbNodes) oftrue -> ok;false -> ?CRITICAL_MSG("Node name mismatch: I'm [~s],
" "the database is owned by ~p", [MyNode, DbNodes]),
?CRITICAL_MSG("Either set ERLANG_NODE in ejabberdctl.cfg " "or change node name in Mnesia", []),
erlang:error(node_name_mismatch) end,
%% 第一個啓動的mnesia結點,創建schema
case mnesia:system_info(extra_db_nodes) of[] -> mnesia:create_schema([node()]);_ -> ok end,
%% 啓動mnesia
ejabberd:start_app(mnesia, permanent),
mnesia:wait_for_tables(mnesia:system_info(local_tables), infinity).