Erlang -- application

application

在OTP中,application模块是一个提供了特定功能的组件,使得一个应用程序能够作为一个整体去启动或关闭,或是在其他系统中复用。application与application controller进行交互,application controller是Erlang运行时的一个进程。application提供了控制应用程序及获取应用程序信息的方法。

一个应用程序通过一个名为Application.app的应用程序资源文件定义,其中Application为该应用程序的名字。该文件位于ebin目录下。.app应用程序资源文件定义了应用程序所需的资源以及启动方法。对于任意一个应用程序都必须有一个应用程序资源文件。
该文件会在应用程序加载或启动时被进程application controller读取。另外这个文件也会被systools中的方法使用。
Application.app包含如下内容:

{application, Application,
  [{description,  Description}, %% 应用程序描述
   {id,           Id},			%% 应用程序标识
   {vsn,          Vsn},			%% 应用程序版本号
   {modules,      Modules},		%% 应用程序所包含的模块列表。用于systools生成启动脚本和打包。一个模块只能包含于一个应用程序。
   {maxP,         MaxP},		%% 应用程序的最大进程数
   {maxT,         MaxT},		%% 应用程序的最大运行时间ms,超时后应用程序停止。
   {registered,   Names},		%% 所有注册的进程名,systools用于检测进程名是否冲突。
   {included_applications, Apps}, %% 当前应用程序所包含的其他应用程序列表,他们在当前应用程序启动时被application controller
   								%% 加载,注意并非启动。当前进程监控器将会启动所包含应用程序的最高层监控器。
   {applications, Apps},		%% 当前应用程序启动前必须启动的应用程序列表,systools用于生成正确的启动脚本。需要注意,
   								%% 任何应用程序都依赖于Kernel和STDLIB。
   {env,          Env},			%% 配置应用程序的参数,可以通过application:get_env/1,2获取。不过此处设定的值将会被配置文件
   								%% 及erl启动命令中的值所替代。
   {mod,          Start},		%% 指定回调模块及启动参数。对于监控树中的应用程序这是要的选项,否则监控树不知道该如何启动该
   								%% 应用程序。对于没有进程的应用程序如代码块STDLIB则无需此项。
   {start_phases, Phases},		%% 指定了应用程序的启动及相应的参数。用用程序启动时除了调用Module:start/2外,还会调用
   								%% Module:start_phase(Phase, Type, PhaseArgs),并且只有在所有阶段启动完毕后,
   								%% application:start(Application)才会返回。start_phase用于被包含及包含的应用程序间的
   								%% 同步,包含其他应用时,mod字段必须为{application_starter,[Module,StartArgs]}。另外,
   								%% 被包含应用程序的start_phase列表必须为包含他的应用程序的start_phase列表的子集。
   {runtime_dependencies, RTDeps}]}. %% 依赖的应用程序的版本列表

             Value                Default
             -----                -------
Application  atom()               -
Description  string()             ""
Id           string()             ""
Vsn          string()             ""
Modules      [Module]             []
MaxP         int()                infinity
MaxT         int()                infinity
Names        [Name]               []
Apps         [App]                []
Env          [{Par,Val}]          []
Start        {Module,StartArgs}   []
Phases       [{Phase,PhaseArgs}]  undefined
RTDeps       [ApplicationVersion] []

Module = Name = App = Par = Phase = atom()
Val = StartArgs = PhaseArgs = term()
ApplicationVersion = string()

这些参数,对于application controller而言都是可省的;而对于systoolsdescription、vsn、modulesregistered以及applications参数是必须有的。

应用程序通过调用application:start(Application).start(Application, Type).启动及调用application:stop(Application).关闭。此处的Typesupervisor中子进程的restart参数。
如果启动应用程序时,应用程序还未被加载,application controller会调用application:load(Application)加载应用程序并读取并存储.app文件中的信息。
应用程序启动时,Module:start(StartType, StartArgs)-> {ok, Pid} | {ok, Pid, State}会被调用,通过启动最高层的监控器来创建监控树。该函数返回最高层监控器的Pid以及StateState默认为[]StartType通常为normal,只有在接管或故障转移的情况下才有其他值。StartArgs在应用程序资源文件的mod中定义。
当应用程序关闭时,通过关闭最高层的监控器一层层向下关闭,然后回调Module:stop(State)函数进行善后。

通过application:loaded_applications().获取已加载的应用程序信息。
对于已加载且启动的程序,在程序关闭时,会自动删除加载的信息
对于已加载但未启动的程序,可通过application:unload(Application).删除对应的加载信息。

通过application:which_applications().获取当前正在运行的应用程序列表。
通过application:get_application(PidOrModule).可以获取进程Pid或者模块所属于的应用程序名称。

通过application:get_key(Key).获取应用程序资源文件的值。

可以在应用程序资源文件中的env中配置参数来配置应用。然后通过application:get_env(Application, Par).来获取配置参数。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页