gen_event 行为模式

Erlang OTP包括4个行为模式: gen_server,gen_event,gen_fsm,supervisor。

gen_event作为事件处理的通用模块,多用于事件跟踪和错误报告中,如日志记录。gen_event由事件管理进程和多个回调模块组成。可通过start或start_link方式启动,再动态地添加或删除事件处理模块。

回调函数需要实现init/1,handle_event/2,handle_info/2,handle_call/2,terminate/2 等接口。gen_event比其它行为模式更能容错。如果一个回调查模块出错或返回值不对,事件管理进程不会关闭,只会把出错模块删除,其他模块将不受影响。

可以通过 gen_server:start或gen_server:start_link建立事件管理进程。gen_server:add_handler/3添加事件处理模块,gen_event:del_handler/3删除事件处理模块。add_handler后,将会调用对应模块的init/1函数,del_handler时,则会回调terminate/2函数。

下面是gen_event的使用例子,向gen_event管理进程中添加两个事件处模块:event,event2。例子主要是为说明gen_event的使用,内部处理很简单,收到消息后打印。

common.hrl

event.erl

event2.erl

编译代码:
erlc *erl

1. 开启gen_event管理进程:

1_start

2. 添加event处理模块

2_addevent

3. 发送log消息

3_send_msg

event的handle_event处理了log消息

4. 添加event2处理模块

4_add_event2

5. 发送log消息

5_event

event,event2 的handle_event都处理了log消息,并且都在事件管理进程中处理的。

5. 发送让event2 crash,看event模块有没受影响

6_crash

事件处理进程还在,event2 crash后没有影响到event模块。

gen_event在事件记录中很有用,ErlangVM自带的日志记录模块error_logger就是通过gen_event来实现的。更多gen_event内容,可参考: http://www.erlang.org/doc/man/gen_event.html

Erlang技术分享内容均为原创,转载请标明本文地址
本文链接:http://www.kongqingquan.com/archives/80

此条目发表在Erlang分类目录,贴了, , 标签。将固定链接加入收藏夹。

gen_event 行为模式》有 1 条评论

  1. Howld说:

    “gen_server:del_handler/2删除事件处理模块”
    这句话应该是gen_event:delete_handler/3

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">