Erlang OTP学习(2):gen_event
来源:互联网 发布:车辆数据 编辑:程序博客网 时间:2024/06/06 19:19
Erlang OTP学习(2):gen_event
- 博客分类:
- Erlang
erlang
说完了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
通常我们会有这么一种需求场景:采集客户端发送的事件,并做相应的处理,如下图:
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
0 0
- Erlang OTP学习(2):gen_event
- 【Erlang】gen_event
- Erlang学习:事件行为(gen_event behaviour)
- erlang gen_event模板
- erlang浅谈(4)-OTP
- Erlang/OTP 监督者(Supervisor)
- erlang四大behaviour之三-gen_event(转载)
- erlang四大behaviour之三-gen_event(转载)
- 18岁的工程师谈 Erlang/OTP(2)
- Erlang学习:OTP - Application & supervisor & gen_server
- OTP设计原则学习笔记(2)
- Erlang学习:A non-OTP supervisor for a non-OTP server
- erlang四大behaviour之三-gen_event
- 业余研究 erlang /OTP
- Erlang OTP 自定义behaviour
- erlang otp 自定义behaviour
- Erlang OTP 热更新
- ERLANG OTP源码分析
- lua开发--web页面服务
- Ubuntu下的重要配置文件修改前要先备份
- Executor的使用
- PostgreSQL学习手册(数据库维护)
- Ubuntu 配置 opencv , CodeBlocks 开发环境
- Erlang OTP学习(2):gen_event
- jsp中的JSTL与EL表达式用法
- android 按钮背景颜色以及按下颜色设置
- CSD(Canonic signed digit)正则有符号数
- keepalived 详解
- python,学校成员类的例子,老师和学生(python class父类与子类之间的联系与逻辑)
- PostgreSQL学习手册(系统表)
- 606第九周周三赛 E - What day is it今天星期几
- [kuangbin带你飞]专题一 简单搜索 E - Find The Multiple poj 1426