ejabberd源码分析《一》application启动

来源:互联网 发布:云计算 大会 编辑:程序博客网 时间:2024/06/08 10:26


直接看启动函数

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