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.