我有一个在自己的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:add_handler/3
)在与事件管理器相同的进程中运行.因此,如果事件管理器在远程节点上运行,则事件处理程序将在同一节点上运行.
实现此目的的一种方法是创建一个事件处理程序回调模块,该模块将事件转发到所需节点上的进程.然后你可以做这样的事情:
gen_event:add_handler({event_manager, node1@host1}, my_event_forwarder, [self()]).