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

来源:互联网 发布:法兰绒哪个牌子好 知乎 编辑:程序博客网 时间:2024/05/29 14:53

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.  

 

原创粉丝点击