ejabberd源碼分析《一》application啓動

什麼都別說,直接看啓動函數

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).

發佈了75 篇原創文章 · 獲贊 29 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章