您的位置:首页 > 其它

面对软件错误构建可靠的分布式系统_笔记11

2009-02-01 22:28 417 查看
6.3通用事件管理器Event Manager
(1)behaviour:gen_event
(2)事件处理器:event manager可以完成:错误处理、告警关联、调试、设备管理
一个事件管理器,可以安装0个或多个事件处理器event handler
(3)通知Notification:向一个事件管理器发送一个事件动作
(4)事件处理器event handler:一个可以处理事件的函数
函数结构为
{ok, SNew } = Mod:handle_event(Event, SOld).

6.3.1通用事件管理器API
(1)gen_evnet:start(Name1) -> {ok, Pid} | {error, Why}
创建一个管理器
Name1:管理器名称,与签名的通用服器命名相同
{ok, Pid}:事件管理器开启成功
{error, Why}: 开启失败
(2)gen_event:add_handler(Name2, Mod, Args) -> ok | Error
添加一个处理器到事件管理器
Name2:事件管理器名称,见前
Mod:回调模块名字
Arg:传递给Mod:init/1参数
(3)gen_event:notify(Name2,E) -> ok
发送事件E给事件Name2管理器,事件管理器会调用
{ok, SNew } = Mi:handle_event(E,SOld).
(4)gen_event:call(Name2,Mod, Args) -> Reply
执行事件处理器上某个操作,会调用
Mod:handle_call(Args, S).
(5)gen_event:stop(Name2) -> ok
停止事件管理器
(6)Mod:init(Args) -> {ok, State}
Args:是gen_evnet:add_handler/3的参数,
State:是事件处理器初始状态
(6)Mod:handle_event(E,S) -> {ok, S1}
E:是gen_event:notify/2参数
S:事件处理器原有状态
S1:事件处理器新状态
(7)Mod:handle_call(Args, State) -> {ok, Reply, State1}
Args是gen_evnet:call/2参数
State是原状态
Reply将成为gen_evnet:call/2返回值
State1是新状态
(8)Mod:terminate(Reason, State) -> void
Reason表示停止原因
State:当前状态

eg:
-module(thesis_logger).
-behaviour(gen_event).

-export([start/0,init/1, handle_event/2,handle_call/2,stop/0, terminate/2]).
-export([log/1,report/0]).

-define(NAME, my_simple_event_logger).

start() ->
case gen_event:start_link({local, ?NAME}) of
Ret = {ok, Pid} ->
gen_event:add_handler(?NAME, ?MODULE, arg1),
Ret;
Other ->
Other
end.

stop() -> gen_event:stop(?NAME).

log(E) -> gen_event:notify(?NAME, {log, E}).

report() ->
gen_event:call(?NAME, ?MODULE, report).

init(arg1) ->
io:format("Logger starting~n"),
{ok,[]}.

handle_event({log, E}, S) -> {ok, trim([E|S])}.

handle_call(report, S) -> {ok, S,S}.

terminate(stop,_) -> true.

trim([X1,X2,X3,X4,X5|_]) -> [X1,X2,X3,X4,X5];
trim(L) -> L.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: