【发布时间】:2017-06-07 14:46:55
【问题描述】:
我有一个在其自己的 Erlang 节点中运行的事件管理器。我想将它用作一个简单的事件代理,并让其他节点上的其他应用程序通过添加自己的事件处理程序来订阅它。
运行时出现如下错误:
{'EXIT',{undef,[{event_handler_a,init,[[]],[]},
{gen_event,server_add_handler,4,
[{file,"gen_event.erl"},{line,429}]},
{gen_event,handle_msg,5,[{file,"gen_event.erl"},{line,270}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}}
所以现在,我想知道我是否做错了什么,或者这种架构是不可能的。由于我的事件处理程序中的逻辑与我的应用程序完全相关,因此我更愿意将其保留在我的应用程序版本中。在我的事件管理器版本中为每个应用程序设置一个事件处理程序可能很快就会变得一团糟。
【问题讨论】:
-
我对
gen_event了解不多,但该错误看起来像gen_event试图调用event_handler_a:init([])并且该模块或该函数未在该 Erlang 节点上定义/加载。 -
@Dogbert 我忘了这个。如果事件管理器从事件处理程序调用 init/1 回调,它将需要指定节点名称。不幸的是,文档显示
add_handler(EventMgrRef, Handler, Args) -> Result和Handler = Module | {Module,Id} -
我认为你可以将其传递为
Args,所以gen_event:add_handler(_, _, node1@host1)。 -
如果我正确理解发生了什么(我希望不是),我的应用程序调用
add_handler/3,然后事件管理器回调init/1。如果是这种情况,在我的情况下,必须通过 rpc 完成回调才能工作。这将彻底破坏最初拥有经纪人的整个想法。 -
来自the doc 向事件管理器EventMgrRef添加一个新的事件处理程序。事件管理器调用 Module:init/1 来启动事件处理程序及其内部状态。因此事件处理程序模块必须与事件管理器位于同一节点上。
标签: erlang erlang-otp