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 Design Principles之Gen中文
otp_win64_24.1.7.exe
OTP 20(及更高版本)中gen_statem的惯用Elixir包装器。 完整文档可。 您可以在在Hex上找到该软件包。 gen_statem和此包装器之间的一个重要区别是,您在此包装器use GenStateMachine回调模式声明为use ...
可用于OTP或Pin码输入 :nerd_face: :nerd_face: 特征 :green_heart: 自动将下一个字段集中在键入上,将上一个字段集中在删除上 游标支持 :high_voltage: 可以设置为任意长度。 (建议3-6个字段) 文本字段的3种...
erl最新版本,erl 23版本 和24版本 属于大版本更新了,有些23版本高性能模块已经不适用24版本,我博客有说明,需要的可以去主页看下。
Erlang是一种通用的面向并发的编程语言,它有瑞典电信设备制造商爱立信所辖的CS-Lab开发, 目的是创造一种可以应对大规模并发活动的编程语言和运行环境。
otp_win64_24.3.exe
react-native-otp-fieldReact本机OTP字段 :keycap_1: :keycap_2: :keycap_3: :keycap_4: :keycap_5:安装npm i react-native-otp-fieldRN <0.63 npm i react-native-otp-field@0.0.7一个可在android和iOS上运行的...
Erlang/OTP
otp_win64_20.3.exe百度网盘下载(官网下载实在是太慢了),亲测有效!! otp_win64_20.3.exe otp_win64_20.3.exe otp_win64_20.3.exe
可能这个实现代码量相对没那么少,但是这样是比较OTP的做法。 ##Installation 在你的rebar.config添加: {gs_tcp, ".*", {git, "https://github.com/roowe/gs_tcp", "master"}} 之后执行 rebar get-deps接着 rebar ...
Erlang/OTP
DX0906VX 显示屏的OTP烧录程序,用来在出厂时设置屏幕的对比度。
Generate & Verify OTP Server
otp_win64_26.0安装包
官网下载超级慢,公司网络也有点封锁,这是我用流量下载的,有需要的可以下载,这是适合Centos的版本21.1
我主页还有相关的rabbitmq-server-3.8.5.exe可以下载,地址https://download.csdn.net/download/qq_39403734/12570527,如果这两个在安装的过程中有什么不懂得可以私聊我,或者我有空的时候出个博客给大家。
OTP Design Principles,指导你如何编写otp的各个behaviours
erlang_otp_win64_25.0
解压后为:otp_src_21.0.tar.gz,附带下载地址