国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
ejabberd分析(三)啟動流程

  1. application:start(ejabberd).  

application用來表示一個可以單獨啟動和停止、并被復用的程序單元。通常一個application都有一個同名的app文件來定義。

對于系統(tǒng)工具(systool)直接調用的app文件必須包含以下幾項:

description, vsn, modules, registered, applications

我們查看ejabberd.app可以看到以下內容:

  1.  {application, ejabberd,  
  2.  [{description, "ejabberd"},  
  3.   {vsn, "2.1.7"},  
  4.   {modules, [acl,  
  5.   ......  
  6.   {registered, [ejabberd,  
  7.   ......  
  8.   {applications, [kernel, stdlib]},  
  9.   {env, []},  
  10.   {mod, {ejabberd_app, []}}]}.  

最后一項:mod 定義了應用程序的回調模塊和啟動參數(shù)。 在應用程序啟動時會由主導進程來調用這個模塊的start/2方法。

ejabberd_app.erl 中的start/2 :

  1. start(normal, _Args) ->  
  2.     ejabberd_loglevel:set(4),  
  3.     write_pid_file(),  
  4.     application:start(sasl),  
  5.     randoms:start(),  
  6.     db_init(),  
  7.     sha:start(),  
  8.     stringprep_sup:start_link(),  
  9.     xml:start(),  
  10.     start(),  
  11.     translate:start(),  
  12.     acl:start(),  
  13.     ejabberd_ctl:init(),  
  14.     ejabberd_commands:init(),  
  15.     ejabberd_admin:start(),  
  16.     gen_mod:start(),  
  17.     ejabberd_config:start(),  
  18.     ejabberd_check:config(),  
  19.     connect_nodes(),  
  20.     %% Loading ASN.1 driver explicitly to avoid races in LDAP  
  21.     catch asn1rt:load_driver(),  
  22.     Sup = ejabberd_sup:start_link(),  
  23.     ejabberd_rdbms:start(),  
  24.     ejabberd_auth:start(),  
  25.     cyrsasl:start(),  
  26.     % Profiling  
  27.     %ejabberd_debug:eprof_start(),  
  28.     %ejabberd_debug:fprof_start(),  
  29.     maybe_add_nameservers(),  
  30.     start_modules(),  
  31.     ejabberd_listener:start_listeners(),  
  32.     INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),  
  33.     Sup;  
 我們可以看到它調用了一系列的方法和函數(shù)來完成整個應用的啟動。

  1. 1. ejabberd_loglevel:set(4)  //設置日志級別  

  1. 2. write_pid_file()  //將當前進程標識寫到環(huán)境變量EJABBERD_PID_PATH定義的文件中  

  1. 3. application:start(sasl) //啟動sasl應用 ,具體sasl應用所提供的服務請查看<a >sasl</a>  

  1. 4. randoms:start() //注冊一個名為random_generator,用當前時間做種子生成隨機字符串的進程  

  1. 5. db_init() //初始化并啟動本地的mnesia數(shù)據(jù)庫,并等待直到所有表可用或超時  

  1. 6. sha:start() //加載一些驅動  

  1. 7. stringprep_sup:start_link() //啟動一個監(jiān)控進程  

  1. 8. xml:start() //提供xml處理功能  

  1. 9. start() //注冊進程自身為ejabberd,設置日志目錄,加載驅動  

  1. 10. translate:start()//從環(huán)境變量EJABBERD_MSGS_PATH定義的位置找*.msg 并加載到ets:translations 表中(國際化)  

  1. 11. acl:start() //訪問控制  

  1. 12. ejabberd_ctl:init() //創(chuàng)建兩張表ejabberd_ctl_cmds,ejabberd_ctl_host_cmd  

  1. 13. ejabberd_commands:init()  //創(chuàng)建表ejabberd_commands  

  1. 14. ejabberd_admin:start() //注冊常用的ejabberd_command到表ejabberd_commands  
    這里的ejabberd_command類似于java中的虛方法,這個ejabberd_command 具有指定的名稱、指定類型數(shù)量參數(shù)、指定類型返回值。

    例如:

        #ejabberd_commands{name = register, tags = [accounts],
            desc = "Register a user",
            module = ?MODULE, function = register,
            args = [{user, string}, {host, string}, {password, string}],
            result = {res, restuple}},

    定義了一個名為register,接受[{user, string}, {host, string}, {password, string}] 參數(shù),返回{res, restuple}的虛方法。


  1. 15. gen_mod:start()   //創(chuàng)建表ejabberd_modules  

  1. 16. ejabberd_config:start()  //創(chuàng)建config,local_config兩張表,并加載配置文件中的配置到表中  

  1. 17. ejabberd_check:config()  //檢查配置文件中指定要加載的模塊是否存在  

  1. 18. connect_nodes()    //建立到集群中其他節(jié)點的鏈接,其他節(jié)點在配置中定義  

  1. 19. Sup = ejabberd_sup:start_link()  //啟動一個supervisor,并啟動和監(jiān)控定義的子進程  

      詳細看下這個supervisior 的init()定義:

  1. {ok, {{one_for_one, 10, 1},  
  2.       [Hooks,  
  3.        NodeGroups,  
  4.        SystemMonitor,  
  5.        Router,  
  6.        SM,  
  7.        S2S,  
  8.        Local,  
  9.        Captcha,  
  10.        ReceiverSupervisor,  
  11.        C2SSupervisor,  
  12.        S2SInSupervisor,  
  13.        S2SOutSupervisor,  
  14.        ServiceSupervisor,  
  15.        HTTPSupervisor,  
  16.        HTTPPollSupervisor,  
  17.        IQSupervisor,  
  18.        STUNSupervisor,  
  19.        FrontendSocketSupervisor,  
  20.        CacheTabSupervisor,  
  21.        Listener]}}  

重啟策略為one_for_one(只重啟終止的子進程自身),如果1s內重啟次數(shù)超過10則終止所有子進程和自身。列表中為子進程的定義。以Hooks為例子:

  1. Hooks =  
  2.     {ejabberd_hooks,  
  3.      {ejabberd_hooks, start_link, []},  
  4.      permanent,  
  5.      brutal_kill,  
  6.      worker,  
  7.      [ejabberd_hooks]}  
子進程定義的格式為:{Id, StartFunc, Restart, Shutdown, Type, Modules}

                id:  分配的ID

                StartFunc: 啟動子進程時調用的方法

                Restart:  重啟子進程時調用的方法

                Shutdown: 關閉子進程時調用的方法

                Type: 子進程的類型,(supervisior or worker)

                Modules:  回調模塊

     可以看到這里啟動了不少的子進程,從名字上大體上可以看出各個子進程的功能。

   

  1. 20. ejabberd_rdbms:start() //啟動數(shù)據(jù)庫相關模塊  
   
  1. 21. ejabberd_auth:start() //啟動所有鑒權模塊  
   
  1. 22. cyrsasl:start() //啟動SASL安全認證模塊  

  1. 23. maybe_add_nameservers() //如果運行在windows系統(tǒng),則添加域名服務器(DNS)地址到erlang系統(tǒng)中  

  1. 24. start_modules()   //啟動所有節(jié)點上的定義在local_config中的模塊  

  1. 25. ejabberd_listener:start_listeners()  //啟動配置文件中的監(jiān)聽器模塊  



本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
配置加載
ASP.NET MVC請求處理管道生命周期的19個關鍵環(huán)節(jié)(1-6)
win10應用Application Identity解決不能自動啟動問題
Thinkphp 框架配置操作之配置加載與讀取配置實例分析
阿帕奇·卡夫卡
Paimei調試跟蹤示例
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服