OTP应用的组织形式
当创建OTP应用时的主要工作集中于标准目录结构的建立和应用元数据的编写
OTP应用的目录布局:
元数据以普通Erlang项式描述,位于ebin目录下的一个名为<application-name>.app的文本文件中
应用行为模式
-module(tr_app).
-behaviour(application). %行为模式声明
-export([
start/2,
stop/1]). %应用行为模式的回调函数
start(_Type, _StartArgs) ->
case tr_sup:start_link() of %启动根监督者
{ok,Pid} ->
{ok,Pid};
Other ->
{error,Other}
end.
stop(_State) ->
ok.
监督者实现容错
-module(test).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []). %启动监督者
init([]) -> %指明如何启动和管理子进程
RestartStrategy = one_for_one,
MaxRestarts = 1000, %规定在设定时间内允许重启的最大次数
MaxSecondsBetweenRestarts = 3600, %设定时间
SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, %指明监督者的行为
Restart = permanent,
Shutdown = 2000,
Type = worker,
AChild = {'AName', {'AModule', start_link, []},
Restart, Shutdown, Type, ['AModule']}, %指明子进程的名称.
{ok, {SupFlags, [AChild]}}. % 返回监督规范
监督者重启策略
1)one_for_one : 当有子进程退出,监督者将针对该进程,且仅针对该进程进行重启
2)one_for_all : 当有子进程退出,监督者重启所有子进程
3)rest_for_one : 当有子进程退出,则在停止并重启那些启动时在该子进程后的进程
4)simple_one_for_one : 简单的一对一
子进程规范
AChild = {'AName', {'AModule', start_link, []},Restart, Shutdown, Type, ['AModule']}
第一个元素ID: 'AName' ,用于在系统内部标识各种规范的项式
第二项Start,是一个用于启动进程的三元组{Module,Function,Arguments}
第三个元素Restart,用于指明子进程发生故障时是否需要重启,可以指定为:permanent(总是),temporary(永不),transient(意外时)
第四个元素shutdown,用于指明如何终止进程,表示终止进程时应采用软关闭策略,给进程;留出一段自我了断的时间,如果进程未能在指定时间内自行退出,则无条件终止.可取值: 整数, brutal_kill(关闭监督进程时立即终止子进程), infinity(主要用于子进程本身也是监督者的情况,表示应给予子进程充分的时间自行退出)
第五个元素Type,用于标识时监督者(supervisor)还是工作者(worker)
第六个选项列出了该进程所依赖的模块,仅用于代码热更新时告知系统该以何种顺序升级各个模块,一般来说,只需要列出子进程的主模块.
生成EDoc文档
edoc:application(tcp_rpc,".",[]).