查看源代码 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 handler() :: atom() | {atom(), term()}
@type manager() :: pid() | name() | {atom(), node()}
@type name() :: atom() | {:global, term()} | {:via, module(), term()}
@type on_start() :: {:ok, pid()} | {:error, {:already_started, pid()}}
@type options() :: [{:name, name()}]

回调

链接到此回调

code_change(old_vsn, state, extra)

查看源代码
@callback code_change(old_vsn, state :: term(), extra :: term()) ::
  {:ok, new_state :: term()}
when old_vsn: term() | {:down, term()}
链接到此回调

handle_call(request, state)

查看源代码
@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()
链接到此回调

handle_event(event, state)

查看源代码
@callback handle_event(event :: term(), state :: term()) ::
  {:ok, new_state} | {:ok, new_state, :hibernate} | :remove_handler
when new_state: term()
链接到此回调

handle_info(msg, state)

查看源代码
@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()
链接到此回调

terminate(reason, state)

查看源代码
@callback terminate(reason, state :: term()) :: term()
when reason:
       :stop | {:stop, term()} | :remove_handler | {:error, term()} | term()