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设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...
otp_win64_24.1.7.exe
- **启动EventManager**:使用`gen_event:start/1`启动。 - **添加事件处理器**:使用`gen_event:add_handler/3`函数添加。 - **通知事件**:通过`gen_event:notify/2`通知事件。 - **删除事件处理器**:使用`gen_...
标题中的"erl:otp_src_24.0.5.tar.gz"指的是Erlang的源码包,其中"otp_src_24.0.5"是Erlang/OTP (Open Telecom Platform) 的24.0.5版本的源代码。Erlang是一种面向并发的、函数式的编程语言,常用于构建高可用性和...
Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...
OTP 20(及更高版本)中gen_statem的惯用Elixir包装器。 完整文档可。 您可以在在Hex上找到该软件包。 gen_statem和此包装器之间的一个重要区别是,您在此包装器use GenStateMachine回调模式声明为use ...
可用于OTP或Pin码输入 :nerd_face: :nerd_face: 特征 :green_heart: 自动将下一个字段集中在键入上,将上一个字段集中在删除上 游标支持 :high_voltage: 可以设置为任意长度。 (建议3-6个字段) 文本字段的3种...
OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...
otp_win64_26.1.2.jpg
OTP(Open Telecommunications Platform)是Erlang编程语言的核心组件之一,主要为构建高可用、分布式和实时系统提供强大的工具。OTP源代码包通常包含了Erlang运行时系统、库和开发工具,使得开发者能够在各种操作...
OTP(One-Time Password)是一种基于时间、事件或挑战/应答机制的一次性密码技术,用于提高用户身份验证的安全性。OTP确保每个密码只能使用一次,从而降低了密码被重放攻击的风险。在Java环境中,我们可以使用不同的...
2. OTP框架:理解其模块化设计、行为(gen_server, gen_event等)、分布式应用和系统监控。 3. RabbitMQ基本概念:掌握消息队列的工作原理、交换器(exchanges)、队列(queues)、绑定(bindings)以及消费者...
在本项目中,“OTP.zip”是一个压缩包,其中包含了实现OTP生成和验证功能的Java代码。 OTP通常基于时间同步(TOTP)或基于挑战-响应的哈希算法(HMAC)两种方式。在这个"OTP"项目中,可能使用了TOTP,因为它是目前...
- `amqp_gen_connection`使用`gen_tcp:connect`与服务器建立TCP连接。服务器端响应并启动`rabbit_client_sup`监督树,包括`rabbit_connection_sup`,进一步创建`rabbit_connection_helper_sup`和`rabbit_reader`...
在IT行业中,`gen_server`是Erlang OTP(开放电信平台)框架中的一个核心组件,它提供了一种模式化的方式来实现服务器进程。本篇博客“gen_server tasting 之超简单名称服务(续)”主要探讨了如何使用gen_server来...
Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心组成部分,它提供了一套全面的库和工具,用于构建高度并发、分布式、容错的系统。OTP的全称实际上是“Open Telecom Platform”,但在现代,它更...
Erlang OTP (Open Telephony Platform) 是一种高级并发编程语言和框架,主要由瑞典电信设备制造商Ericsson开发,用于构建高度可靠、可扩展和实时的分布式系统。Erlang OTP 25.0是该平台的一个版本,特别针对Windows ...
OTP(One-Time Programmable)是一种只可编程一次的非易失性存储器技术,常用于存储固定配置数据或密钥。在显示屏领域,OTP被用来烧录特定的参数,如对比度、亮度等,以确保显示器在出厂时具有最佳的显示效果。 在...
Erlang/OTP
otp_win64_24.3.exe