我有一个在自己的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}]}]}}
所以现在,我想知道我做错了什么,或者这个架构是不可能的。由于我的事件处理程序中的逻辑与我的应用程序完全相关,我宁愿将其保留在我的应用程序版本中。在我的事件管理器版本中为每个应用程序设置一个事件处理程序可能会很快变得混乱。
答案 0 :(得分:5)
不,这是不可能的。 gen_event
与其他行为的作用略有不同,因为回调模块中的代码(作为gen_event:add_handler/3
参数传递的代码)在相同的进程中运行活动经理。因此,如果事件管理器在远程节点上运行,则事件处理程序将在同一节点上运行。
实现此目的的一种方法是创建一个事件处理程序回调模块,该模块将事件转发到所需节点上的进程。然后你可以做这样的事情:
gen_event:add_handler({event_manager, node1@host1}, my_event_forwarder, [self()]).