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.\nWelc"...>>}]},
                {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

 

转载于:https://www.cnblogs.com/lawen/p/5049080.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值