Erlang OTP学习(2):gen_event

本文通过实例介绍如何使用Erlang的gen_event模块来创建事件服务器(EventServer),并展示了如何动态添加和删除事件处理器(EventHandler)。事件服务器接收客户端发送的事件,并将事件分发给所有注册的事件处理器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说完了gen_server,今天我们来看看gen_event。 

通常我们会有这么一种需求场景:采集客户端发送的事件,并做相应的处理,如下图: 

EventServer负责接收客户端发送的事件消息,当它接受到一个事件消息后, 它回调所有的EventHandler处理这条信息(不同的EventHandler对同一条消息会才采取不同的响应),所以EventServer实际上是充当着 代理的角色,实际的事件消息是由EventHandler处理(我们称EventHandler是EventServer的callback模块) 

现在我们按照上图,实现一下EventServer: 

我们可以通过add_handler方法 动态的往EventServer中添加EventHandler(EventServer内部维护着一个HandlerList); 
notify方法供客户端向EventServer发送事件消息,当EventServer收到一条事件消息时({event, Event}),它遍历HandlerList,把这条消息交给每个EventHandler处理; 

接着,我们实现两个EventHandler(EventServer的callback模块),其中terminal_logger会把接受到的事件消息打印到控制台,file_logger会把事件消息记录到文件。 
 

 

现在我们运行下程序,看下效果 

 

 

event_server:start()启动了一个EventServer(初始状态下没有任何的EventHandler),接着我们动态的添加了两个EventHandler(3,4两行命令),最后我们使用event_server:notify方法向EventServer发送了两条事件消息,当EventServer收到这些消息后,回调所有的EventHandler进行处理,其中terminal_logger将收到的事件打印到了屏幕(如红色箭头部分),file_logger将事件保存到了event.log中 

至此我们就实现了一个EventServer,那么gen_event是什么呢?它实际上就是我们刚才EventServer的一种实现并且提供更多更稳健的功能(譬如,不仅支持EventHandler的动态添加,也支持动态卸载),下面我们就用gen_event重新实现以下刚才的需求: 




执行下程序: 




第四行,我们向event_server发送一条事件消息,这时候屏幕上,文件里都记录了hello world这条事件消息,当我们调用gen_event:delete_handler方法去掉new_terminal_logger后,再次发送事件消息,这时候只有文件中会记录,屏幕上不再显示 

关于gen_event我们就说道这里,更多api细节,请看: http://www.erlang.org/doc/man/gen_event.html 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值