zoukankan      html  css  js  c++  java
  • ejabberd分析(三)启动流程

    ejabberd的启动从ejabberd:start() 开始。


    application用来表示一个可以单独启动和停止、并被复用的程序单元。通常一个application都有一个同名的app文件来定义。

    对于系统工具(systool)直接调用的app文件必须包含以下几项:

    description, vsn, modules, registered, applications

    我们查看ejabberd.app可以看到以下内容:


    最后一项:mod 定义了应用程序的回调模块和启动参数。 在应用程序启动时会由主导进程来调用这个模块的start/2方法。

    ejabberd_app.erl 中的start/2 :

     我们可以看到它调用了一系列的方法和函数来完成整个应用的启动。

        这里的ejabberd_command类似于java中的虚方法,这个ejabberd_command 具有指定的名称、指定类型数量参数、指定类型返回值。

        例如:

            #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}] 参数,返回{res, restuple}的虚方法。


          详细看下这个supervisior 的init()定义:

    重启策略为one_for_one(只重启终止的子进程自身),如果1s内重启次数超过10则终止所有子进程和自身。列表中为子进程的定义。以Hooks为例子:

    子进程定义的格式为:{Id, StartFunc, Restart, Shutdown, Type, Modules}

                    id:  分配的ID

                    StartFunc: 启动子进程时调用的方法

                    Restart:  重启子进程时调用的方法

                    Shutdown: 关闭子进程时调用的方法

                    Type: 子进程的类型,(supervisior or worker)

                    Modules:  回调模块

         可以看到这里启动了不少的子进程,从名字上大体上可以看出各个子进程的功能。

       

           





  • 相关阅读:
    为什么cmd拖拽文件进去时有时候带引号,有时候不带?
    Android开发学习笔记:Spinner和AutoCompleteTextView浅析
    使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
    Android Fragment完全解析,关于碎片你所需知道的一切
    国外程序员推荐:每个程序员都应该读的非编程书
    百度地图添加覆盖物与给定两点路线规划
    Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用
    Unable to execute dex: Multiple dex files define 解决方法
    Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
    poppupwindow android
  • 原文地址:https://www.cnblogs.com/yjl49/p/2371961.html
Copyright © 2011-2022 走看看