是否可以将本地事件处理程序添加到远程事件管理器

Is it possible to add a local event handler to a remote event manager

我在自己的 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()]).