什么是 GenEvent
GenEvent 是一个用来实现函数化的事件处理行为的模块.
事件处理模型包含了一个通用的事件管理进程, 以及多个可以被动态添加和删除的事件句柄.
例子
GenEvent 有许多应用场景, 例如, 构建一个日志收集系统. 不同的 log 消息对应不同的处理方式. 有的消息会在终端打印出错误信息, 有的会写入文件, 有的会保存在内存中.
# 定义一个事件处理者
defmodule LoggerHandler do
use GenEvent
# 定义回调
def handle_event({:log, x}, messages) do
{:ok, [x | messages]}
end
def handle_call(:messages, messages) do
{:ok, Enum.reverse(messages), []}
end
end
# 启动一个新的事件管理者
{:ok, pid} = GenEvent.start_link([])
# 将处理者添加到到管理者名下
GenEvent.add_handler(pid, LoggerHandler, [])
#=> :ok
# 发送一些事件给管理者.
GenEvent.notify(pid, {:log, 1})
#=> :ok
GenEvent.notify(pid, {:log, 2})
#=> :ok
# 调用管理者名下特定的处理者.
GenEvent.call(pid, LoggerHandler, :messages)
#=> [1, 2]
GenEvent.call(pid, LoggerHandler, :messages)
#=> []