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
而言都是可省的;而对于systools
,description
、vsn、modules
、registered
以及applications
参数是必须有的。
应用程序通过调用application:start(Application).
或start(Application, Type).
启动及调用application:stop(Application).
关闭。此处的Type
同supervisor
中子进程的restart
参数。
如果启动应用程序时,应用程序还未被加载,application controller
会调用application:load(Application)
加载应用程序并读取并存储.app
文件中的信息。
应用程序启动时,Module:start(StartType, StartArgs)-> {ok, Pid} | {ok, Pid, State}
会被调用,通过启动最高层的监控器来创建监控树。该函数返回最高层监控器的Pid
以及State
,State
默认为[]
。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).
来获取配置参数。