`
hideto
  • 浏览: 2678849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OTP Design Principles: Gen_Event Behaviour

阅读更多
1,事件处理原则
在OTP里,event manager是一个命名对象,它可以接收event
一个event可以是一个error、alarm或者一些应该被log的信息
在event manager里会安装一些event handler
当event manager被通知一个event时,event会被所有安装的event handler来处理
event manager实现为一个进程,而每个event handler实现为一个callback模块
event manager本质上是维护一个{Module, State}对的list,每个Module是一个event handler,State是event handler的内部状态

2,例子
将error消息输出到终端的callback模块:
-module(terminal_logger).
-behaviour(gen_event).

-export([init/1, handle_event/2, terminate/2).

init(_Args) ->
  {ok, []}.

handle_event(ErrorMsg, State) ->
  io:format("***Error*** ~p~n", [ErrorMsg]),
  {ok, State}.

terminate(_Args, _State) ->
  ok.

将error消息写入到文件的callback模块:
-module(file_logger).
-behaviour(gen_event).

-export([init/1, handle_event/2, terminate/2]).

init(File) ->
  {ok, Fd} = file:open(File, read).
  {ok, Fd}.

handle_event(ErrorMsg, Fd) ->
  io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
  {ok, Fd}.

terminate(_Args, Fd) ->
  file:close(Fd).


3,启动一个event manager
启动一个event manager来处理error需要调用如下方法:
gen_event:start_link({local, error_man})

这个方法启动一个新的event manager进程并连接它
参数{local, error_man}指定名字,在这里event manager在本地注册为error_man
gen_event:start则是启动一个独立的event manager,没有supervisor

4,添加event handler
这里是启动event manager并添加一个event handler的例子:
1> gen_event:start({local, error_man}).
{ok,<0.31.0>}
2> gen_event:add_handler(error_man, terminal_logger, []).
ok

gen_event:add_handler用来添加一个event hander
event manager将调用callback方法terminal_logger:init([]),参数[]为add_handler的第三个参数
init返回{ok, State},State是event handler的内部状态
init(_Args) ->
  {ok, []}.

init(File) ->
  {ok, Fd} = file:open(File, read),
  {ok, Fd}.


5,通知event
3> gen_event:notify(error_man, no_reply).
***Error*** no_reply
ok

error_man是event manager的名字,no_reply是event
event被当作一个消息发送给event manager
event接收以后event manager为每个event handler调用handle_event(Event, State),调用顺序为event handler添加的顺序相反的顺序
handle_event返回{ok, State1},State1是event handler的新状态
handle_event(ErrorMsg, State) ->
  io:format("***Error*** ~p~n", [ErrorMsg]),
  {ok, State}.

handle_event(ErrorMsg, Fd) ->
  io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
  {ok, Fd}.


6,删除event handler
gen_event:delete_handler(error_man, terminal_logger, []).
ok

这将发送一个消息给event manager来删除terminal_logger这个event handler
还将调用回调方法terminal_logger:terminate([], State),参数[]为delete_handler方法的第三个参数,返回值被忽略
terminate(_Args, _State) ->
  ok.

terminate(_Args, Fd) ->
  file:close(Fd).


7,停止
当event manger停止之后,它将会让每个event handler调用terminate/2
7.1 在supervision tree里
不需要stop方法
7.2 独立的event manager
可以调用stop方法来停止event manager
> gen_event:stop(error_man).
ok


补充:gen_event exports and callbacks
gen_event module                             Callback module
gen_event:start_link
gen_event:start
gen_event:add_handler ----------------------> Module:init/1
gen_event:add_suphandler
gen_event:notify ---------------------------> Module:handle_event/2
gen_event:sync_notify
gen_event:call -----------------------------> Module:handle_call/2
gen_event:delete_handler -------------------> Module:terminate/2
gen_event:swap_handler ---------------------> Module1:terminate/2 Module2:init/1
gen_event:swap_sup_handler
gen_event:which_handlers
gen_event:stop -----------------------------> Module:terminate/2
                                              Module:handle_info/2
                                              Module:code_change/3
分享到:
评论

相关推荐

    erlang OTP Design Principles之Gen中文

    Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...

    Erlang安装包,版本:otp_win64_24.1.7.exe

    otp_win64_24.1.7.exe

    OTP Design Principles

    - **启动EventManager**:使用`gen_event:start/1`启动。 - **添加事件处理器**:使用`gen_event:add_handler/3`函数添加。 - **通知事件**:通过`gen_event:notify/2`通知事件。 - **删除事件处理器**:使用`gen_...

    erl:otp_src_24.0.5.tar.gz

    标题中的"erl:otp_src_24.0.5.tar.gz"指的是Erlang的源码包,其中"otp_src_24.0.5"是Erlang/OTP (Open Telecom Platform) 的24.0.5版本的源代码。Erlang是一种面向并发的、函数式的编程语言,常用于构建高可用性和...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...

    gen_state_machine:OTP 19(及更高版本)中gen_statem的惯用Elixir包装器

    OTP 20(及更高版本)中gen_statem的惯用Elixir包装器。 完整文档可。 您可以在在Hex上找到该软件包。 gen_statem和此包装器之间的一个重要区别是,您在此包装器use GenStateMachine回调模式声明为use ...

    pin_code_fields:Flutter软件包,将帮助您生成具有精美设计和动画的PIN码字段。 可以用于OTP或Pin码输入:nerd_face::nerd_face:

    可用于OTP或Pin码输入 :nerd_face: :nerd_face: 特征 :green_heart: 自动将下一个字段集中在键入上,将上一个字段集中在删除上 游标支持 :high_voltage: 可以设置为任意长度。 (建议3-6个字段) 文本字段的3种...

    otp_src_22.0_h.tar.gz

    OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...

    otp_win64_26.1.2.jpg

    otp_win64_26.1.2.jpg

    otp_src_21.2_linux.rar

    OTP(Open Telecommunications Platform)是Erlang编程语言的核心组件之一,主要为构建高可用、分布式和实时系统提供强大的工具。OTP源代码包通常包含了Erlang运行时系统、库和开发工具,使得开发者能够在各种操作...

    otp_verify_java.rar_OTP_OTPVerify_TOTP_otp算法_一次性 口令

    OTP(One-Time Password)是一种基于时间、事件或挑战/应答机制的一次性密码技术,用于提高用户身份验证的安全性。OTP确保每个密码只能使用一次,从而降低了密码被重放攻击的风险。在Java环境中,我们可以使用不同的...

    otp_win64_23.1.exe|otp_win64_23.1.zip

    2. OTP框架:理解其模块化设计、行为(gen_server, gen_event等)、分布式应用和系统监控。 3. RabbitMQ基本概念:掌握消息队列的工作原理、交换器(exchanges)、队列(queues)、绑定(bindings)以及消费者...

    OTP.zip_OTP_OTP .nd pudn_java otp_otp java_verify

    在本项目中,“OTP.zip”是一个压缩包,其中包含了实现OTP生成和验证功能的Java代码。 OTP通常基于时间同步(TOTP)或基于挑战-响应的哈希算法(HMAC)两种方式。在这个"OTP"项目中,可能使用了TOTP,因为它是目前...

    RabbitMQ系统客户端连接到RabbitMQ服务端消息通信过程1

    - `amqp_gen_connection`使用`gen_tcp:connect`与服务器建立TCP连接。服务器端响应并启动`rabbit_client_sup`监督树,包括`rabbit_connection_sup`,进一步创建`rabbit_connection_helper_sup`和`rabbit_reader`...

    gen_server tasting 之超简单名称服务(续)

    在IT行业中,`gen_server`是Erlang OTP(开放电信平台)框架中的一个核心组件,它提供了一种模式化的方式来实现服务器进程。本篇博客“gen_server tasting 之超简单名称服务(续)”主要探讨了如何使用gen_server来...

    Erlang otp_win64_21.1.exe otp_win32_21.1.exe

    Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心组成部分,它提供了一套全面的库和工具,用于构建高度并发、分布式、容错的系统。OTP的全称实际上是“Open Telecom Platform”,但在现代,它更...

    erlang_otp_win64_25.0

    Erlang OTP (Open Telephony Platform) 是一种高级并发编程语言和框架,主要由瑞典电信设备制造商Ericsson开发,用于构建高度可靠、可扩展和实时的分布式系统。Erlang OTP 25.0是该平台的一个版本,特别针对Windows ...

    otp.rar_OTP_otp显示程序_otp烧录显示屏_显示屏OTP

    OTP(One-Time Programmable)是一种只可编程一次的非易失性存储器技术,常用于存储固定配置数据或密钥。在显示屏领域,OTP被用来烧录特定的参数,如对比度、亮度等,以确保显示器在出厂时具有最佳的显示效果。 在...

    otp_win64_25.0.2.exe

    Erlang/OTP

    otp_win64_24.3.exe

    otp_win64_24.3.exe

Global site tag (gtag.js) - Google Analytics