Erlang --- OTP应用

浅显的说,OTP应用无非就是一组相互关联的代码。我们将其中一部分称为库应用:这些应用纯粹是供其他应用调用的一系列模块的集合,Erlang/OTP的stdlib就是库应用的一个实例,还有一些应用则更为常见,它们具有自己的生存周期,启动之后会运行上一段时

间,最后终止,我们将这类应用称为主动应用,每个主动应用都配有一个负责对应用进程进行管理的根监督者。

创建OTP应用时的主要工作集中于标准目录结构的建立和应用元数据的编写。

1、标准目录结构

doc:用于存放文档。如果文档是用EDoc生成的,请将overview.edoc文件放在此处,其余的文件将会自动生成

ebin:用于存放编译后的代码(.beam文件)。含有应用元数据的.app文件也应存放在此处

include:用于存放公共头文件。所有作为公共API的一部分的.hrl文件都应该放在这个目录中。仅用于你自己的代码之中且不打算公开的私有.hrl文件则应该与其余的源码文件一起放在src目录下

priv:用于存放各种需要随应用一起发布的其他内容

src:用于存放应用的源码。不仅包括Erlang.erl文件和内部.hrl文件,也包括YECC、MIB等其他资源文件,如果不打算随应用一起发布源码,可以省去该目录或将该目录留空

2、应用元数据的编写

应用元数据以普通Erlang项式描述,位于ebin目录下的一个名为<application-name>.app的文本文件中。例如:

{application, cowboy, [
    {description, "Small, fast, modular HTTP server."},
    {vsn, "0.5.0"},
    {modules, []},
    {registered, [cowboy_clock, cowboy_sup]},
    {applications, [
        kernel,
        stdlib
    ]},
    {mod, {cowboy_app, []}},
    {env, []}
]}.

这个.app文件的作用在于告诉OTP如何启动应用,以及该应用应该如何与系统中的其他应用相融合。

这是一个三元组,其中第二个元素是应用名称所对应的原子,第三个元素是一个参数列表,其中每个参数都是{key,Value}对的形式。

description:针对应用的简短描述

vsn:应用的版本

modules:应用中的模块列表

registered:对Erlang进程进行注册后,便可以用注册名来定位进程。在.app文件中罗列出所有进程注册名并不会促使系统执行实际的注册操作,但这可以告知OTP系统哪个进程注册了哪个名字,从而为系统升级等操作提供便利,同时也可以尽早发现重复的注册名并给出警告

applications:必须在该应用启动前先行启动的所有应用

mod:告知OTP系统应该如何启动应用,该参数的值是一个元组,其内容为一个模块名以及一些可选的启动参数,这个模块必须实现application行为模式。

上面mod的描述提到,创建的应用还需要一个启动入口,而且它必须是application行为模式的一个实现模块。

每个主动应用都配有一个application行为模式的实现模块。该模块用于实现系统启动逻辑。它至少要负责根监督者的启动,该监督者将成为应用中其他所有进程的鼻祖,根据系统需要,应用行为模式模块还可以完成一些其他任务。

应用行为模式的命名:应用行为模式的实现模块通常被命名为<application-name>_app。

-behaviour(application).
-export([start/2, stop/1, profile_output/0]). 
-type application_start_type() :: normal
    | {takeover, node()} | {failover, node()}.
 
-spec start(application_start_type(), any()) -> {ok, pid()}.
start(_Type, _Args) ->
    cowboy_sup:start_link().
 
-spec stop(any()) -> ok.
stop(_State) ->
    ok.

OTP系统会在应用即将启动时调用start/2函数,它负责完成实际的启动工作并以{ok,Pid}的形式返回根监督者的进程ID,其他各种需要在应用启动时完成的任务,如配置文件的读取、ETS表的初始化等,也可以在此进行。

总结一下,建立OTP应用要做3件事

第一:遵循标准目录结构;

第二:添加用于存放应用元数据的.app文件;

第三:创建一个application行为模式实现模块,负责启动应用。

posted @ 2016-04-28 14:51  孔夫子耍大刀  阅读(693)  评论(0编辑  收藏  举报