查看源代码 GenEvent 行为 (Elixir v1.16.2)
此行为已弃用。请使用 Erlang/OTP 的 :gen_event 模块。
具有事件处理程序行为的事件管理器。
如果您有兴趣实现事件管理器,请阅读下面的“备选方案”部分。如果您必须实现事件处理程序以与现有系统集成(例如 Elixir 的 Logger),请使用 :gen_event
替代。
备选方案
有一些合适的替代方案可以替换 GenEvent。它们中的每一个都可以根据用例最有利。
监管器和 GenServers
GenEvent 的一个替代方案是一个非常小的解决方案,它由使用监管器和多个在它之下启动的 GenServers 组成。监管器充当“事件管理器”,子 GenServers 充当“事件处理程序”。这种方法有一些缺点(例如它没有提供任何背压),但仍然可以替代 GenEvent 用于它的低配置文件使用情况。 José Valim 的这篇博文 对这种方法有更详细的信息。
GenStage
如果使用 GenEvent 的用例需要更复杂的逻辑,GenStage 提供了一个很好的替代方案。GenStage 是一个由 Elixir 团队维护的外部 Elixir 库;它提供了一个工具来实现以需求驱动的方式交换事件的系统,并内置支持背压。有关更多信息,请参见 GenStage 文档。
:gen_event
如果您的用例需要 GenEvent 提供的确切功能,或者您必须与现有的基于 :gen_event
的系统集成,您仍然可以使用 :gen_event
Erlang 模块。
类型
@type on_start() :: {:ok, pid()} | {:error, {:already_started, pid()}}
@type options() :: [{:name, name()}]
回调
@callback code_change(old_vsn, state :: term(), extra :: term()) ::
{:ok, new_state :: term()}
when old_vsn: term() | {:down, term()}
@callback handle_call(request :: term(), state :: term()) ::
{:ok, reply, new_state}
| {:ok, reply, new_state, :hibernate}
| {:remove_handler, reply}
when reply: term(), new_state: term()
@callback handle_event(event :: term(), state :: term()) ::
{:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()
@callback handle_info(msg :: term(), state :: term()) ::
{:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()
@callback init(args :: term()) ::
{:ok, state} | {:ok, state, :hibernate} | {:error, reason :: any()}
when state: any()
@callback terminate(reason, state :: term()) :: term()
when reason:
:stop | {:stop, term()} | :remove_handler | {:error, term()} | term()