zoukankan      html  css  js  c++  java
  • ejabberd启动流程

    ejabberd.app.src

    {application, ejabberd,
     [{description, "ejabberd"},
      {vsn, "15.11.55"},
      {modules, []},
      {registered, []},
      {applications, [kernel, stdlib]},
      {env, []},
      {mod, {ejabberd_app, []}}]}.
    View Code

    则可以看到启动ejabberd_app模块的start/2方法

    ejabberd_app.erl

    start(normal, _Args) ->
        ejabberd_logger:start(),
        write_pid_file(),
        jid:start(),
        start_apps(),
        ejabberd:check_app(ejabberd),
        randoms:start(),
        db_init(),
        start(),
        translate:start(),
        ejabberd_ctl:init(),
        ejabberd_commands:init(),
        ejabberd_admin:start(),
        gen_mod:start(),
        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(),
        start_modules(),
        ejabberd_listener:start_listeners(),
        ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
        Sup;
    View Code

    则可以看到调用一系列的方法和函数:

    ejabberd_logger:start()        //加载sasl、lager,设置sasl、lager的环境变量,并启动lager
    write_pid_file()        //当前的pid写入pid文件
    jid:start()        //创建jid的ets表

    start_apps() //启动各个模块


    start_apps() ->
    crypto:start(),
    ejabberd:start_app(sasl),
    ejabberd:start_app(ssl),
    ejabberd:start_app(p1_yaml),
    ejabberd:start_app(p1_tls),
    ejabberd:start_app(p1_xml),
    ejabberd:start_app(p1_stringprep),
    ejabberd:start_app(p1_zlib),
    ejabberd:start_app(p1_cache_tab).

    ejabberd:check_app(ejabberd)        //检测ejabberd模块的位置路径
    randoms:start()        //注册一个名为random_generator,用当前时间做种子生成随机字符串的进程 
    db_init()        //初始化并启动本地的mnesia数据库,并等待直到所有表可用或超时
    start()        //开启一个进程注册自己为ejabberd,并一直空loop()
    translate:start()        //创建translations表(ets),并加载语言文件到translations(国际化)
    ejabberd_ctl:init()        //创建两张表ejabberd_ctl_cmds(ets),ejabberd_ctl_host_cmds(ets)
    ejabberd_commands:init()        //创建ejabberd_commands(ets)
    ejabberd_admin:start()        //添加ejabberd_admin里面的commands到ejabberd_commands
    gen_mod:start()        //创建ejabberd_modules表(ets)
    ext_mod:start()        //启动inets模块, 添加ext_mod里面的commands到ejabberd_commands
    ejabberd_config:start()        //创建local_config表(mnesia),并加载配置文件
    set_settings_from_config()        //设置日志级别,默认为4   开启net_kernel:set_net_ticktime
    acl:start()        //访问控制 ,创建表acl(mnesia)、access(mnesia),并根据配置文件添加ACLs,AccessRules内容
    shaper:start()        //创建表shaper(mnesia),并根据配置文件添加内容
    connect_nodes()        //创建节点间的链接    net_kernel:connect_node
    Sup = ejabberd_sup:start_link()        //启动一个supervisor,并启动和监控定义的子进程 
    {ok, {{one_for_one, 10, 1},
          [Hooks,
           NodeGroups,
           SystemMonitor,
           Router,
           Router_multicast,
           S2S,
           Local,
           Captcha,
           ReceiverSupervisor,
           S2SInSupervisor,
           S2SOutSupervisor,
           ServiceSupervisor,
           HTTPSupervisor,
           IQSupervisor,
           FrontendSocketSupervisor,
           Listener]}} //重启策略为one_for_one(只重启终止的子进程自身),如果1s内重启次数超过10则终止所有子进程和自身
    ejabberd_rdbms:start()        //启动数据库相关模块
    ejabberd_riak_sup:start()        //启动riakc
    ejabberd_sm:start()        //启动ejabberd_sm  作为ejabberd_sup的子进程
    cyrsasl:start()        //启动cyrsasl
    maybe_add_nameservers()        //如果运行在windows系统,则添加域名服务器(DNS)地址到erlang系统中 
    ejabberd_auth:start()        //启动auth模块
    ejabberd_oauth:start()        //启动oauth模块
    start_modules()        //启动所有节点上的定义在local_config中的模块
    [{mod_adhoc,[]},
     {mod_announce,[{access,announce}]},
     {mod_blocking,[]},
     {mod_caps,[]},
     {mod_carboncopy,[]},
     {mod_client_state,[]},
     {mod_configure,[]},
     {mod_disco,[]},
     {mod_http_bind,[]},
     {mod_irc,[]},
     {mod_last,[]},
     {mod_muc,[{access,muc},
               {access_create,muc_create},
               {access_persistent,muc_create},
               {access_admin,muc_admin}]},
     {mod_offline,[{access_max_user_messages,max_user_offline_messages}]},
     {mod_ping,[]},
     {mod_privacy,[]},
     {mod_private,[]},
     {mod_pubsub,[{access_createnode,pubsub_createnode},
                  {ignore_pep_from_offline,true},
                  {last_item_cache,false},
                  {plugins,[<<"flat">>,<<"hometree">>,<<"pep">>]}]},
     {mod_register,[{welcome_message,[{subject,<<"Welcome!">>},
                                      {body,<<"Hi.
    Welc"...>>}]},
                    {ip_access,trusted_network},
                    {access,register}]},
     {mod_roster,[]},
     {mod_shared_roster,[]},
     {mod_stats,[]},
     {mod_time,[]},
     {mod_vcard,[{search,false}]},
     {mod_version,[]}]
    ejabberd_listener:start_listeners()        //启动配置文件中的监听器模块

    [{{5222,{0,0,0,0},tcp},
    ejabberd_c2s,
    [{access,c2s},{shaper,c2s_shaper},{max_stanza_size,65536}]},
    {{5269,{0,0,0,0},tcp},ejabberd_s2s_in,[]},
    {{5280,{0,0,0,0},tcp},
    ejabberd_http,
    [{captcha,true},
    {http_bind,true},
    {web_admin,true},
    {request_handlers,[{<<"/websocket">>,ejabberd_http_ws}]}]}]

    ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),        //打印启动信息
    Sup;        //返回pid
  • 相关阅读:
    Shell变量之自定义变量、环境变量
    Shell变量命名规则
    获取文件编码格式
    基于Lucene的文件检索Demo
    数据库压力测试工具
    插入ts以及判断列是否存在(支持多数据库)
    (摘)Chart属性设置
    (摘)C#comboBox绑定数据
    (摘)ORACLE DBA的职责
    (摘)DataGuard物理standby管理
  • 原文地址:https://www.cnblogs.com/lawen/p/5049080.html
Copyright © 2011-2022 走看看