• 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
  • 相关阅读:
    Magical系列软件产品项目启动了
    IT从业者的学习规划 学习者系列文章开篇
    软件项目角色指南开篇
    使用CSS定位页面的“footer”
    项目管理知识体系指南【3】项目生命期与组织
    读书感受 软件设计师 你必须知道的.NET (C#类型存储方式分析)
    软件外包及其项目管理分析
    项目管理知识体系指南【1】开篇
    项目管理知识体系指南【4】单个项目管理过程
    软件设计师之路【1】开篇
  • 原文地址:https://www.cnblogs.com/lawen/p/5049080.html
Copyright © 2020-2023  润新知