ejabberd16.09源码分析(二) ejabberd启动详解

来源:互联网 发布:金融投资网站源码 编辑:程序博客网 时间:2024/05/25 20:01

接上篇(ejabberd16.06源码分析(一) application启动)继续探索ejabberd启动的细节。
ejabberd_app.erl 中的start/2 :
start(normal, _Args) ->
    ejabberd_logger:start(),  %启动日志记录
    write_pid_file(),         %判断环境变量EJABBERD_PID_PATH是否存在,如果存在,

则将当前进程标识写到定义的文件中。否则什么都不做。
    jid:start(),              %创建jid的搜索模式, 存储在ets中,供后续使用
    start_apps(),             %启动其他的app,包括:sasl、ssl、fast_yaml、fast_tls、fast_xml、stringprep、cache_tab
start_elixir_application(),  %判断elixir配置是否使能, 使能则启动elixir,否则什么都不做。
    ejabberd:check_app(ejabberd),  %检查ejabberd需要的module是否都有,如果没有,则ejabberd退出。
    randoms:start(),               %启动生成随机数模块
    db_init(),                     %启动mnesia,并初始化。
    start(),                       %以spawn_link方式启动ejabberd进程。loop空循环
    translate:start(),             %从环境变量EJABBERD_MSGS_PATH定义的位置找*.msg并加载到ets:translations

表中(为了国际化)
    ejabberd_ctl:init(),           %创建两张ets表,ejabberd_ctl_cmds, ejabberd_ctl_host_cmds
    ejabberd_commands:init(),      %创建ets表, ejabberd_commands    
    ejabberd_admin:start(),        %注册常用的ejabberd commands
    gen_mod:start(),               %创建ets表,ejabberd_modules
    ext_mod:start(),   %增加ejabberd modules到code path中
setup_if_elixir_conf_used(),   %if elixir的配置被使用,则安装elixir,否则什么都不做。
    ejabberd_config:start(),       %获取环境变量EJABBERD_CONFIG_PATH的值,

读取该配置文件的内容, 生成ShareKey
    set_settings_from_config(),    %根据配置文件的内容, 设置log模块的level值,

并设置net_ticktime的值,默认为60秒。
    acl:start(),                   %创建存储acl的mnesia表, 并从配置文件中加载数据。
    shaper:start(),                %创建存储shaper的mnesia表, 并从配置文件中加载数据。
    connect_nodes(),               %从配置文件中读取cluster_nodes的配置, 并连接各节点。
    Sup = ejabberd_sup:start_link(), %建立监控进程
    ejabberd_rdbms:start(),          %从配置文件中读取sql相关配置, 然后开始该模块。
    ejabberd_riak_sup:start(),       %从配置文件中读取riak相关配置, 然后开始该模块。
    ejabberd_redis:start(),          %从配置文件中读取redis相关配置, 然后开始该模块。
    ejabberd_sm:start(),             %启动sm模块
    cyrsasl:start(),                 %启动cyrsasl模块
    maybe_add_nameservers(),         %如果ejabberd运作在Windows机器上, 获取nameservers并且增加到Erlang
    ejabberd_auth:start(),           %启动auth模块
    ejabberd_oauth:start(),          %启动oauth模块
    gen_mod:start_modules(),         %启动该host的所以modules
    ejabberd_listener:start_listeners(), %开始网络监听。
ejabberd_service:start(),        %创建ets表,delegated_namespaces和hooks_tmp
    register_elixir_config_hooks(),  %注册elixir config hooks
    Sup;    
在start函数中,调用一系列的方法和函数来完成整个应用的启动。



0 0