2017-01-23 1 views
2

Ich habe einen Event-Manager in einem eigenen Erlang-Knoten ausgeführt. Ich möchte es als einen einfachen Ereignisbroker verwenden und andere Anwendungen auf anderen Knoten zulassen, indem Sie ihren eigenen Ereignishandler hinzufügen.Ist es möglich, einen lokalen Event-Handler zu einem Remote-Event-Manager hinzuzufügen

Mein Test-Setup sieht wie folgt aus (sorry die schreckliche Einbuchtung) enter image description here

Wenn diese läuft ich einen Fehler wie:

{'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}]}]}} 

So, jetzt frage ich mich, wenn ich etwas falsch tue oder wenn diese Architektur einfach nicht möglich ist. Da die Logik in meinem Event-Handler vollständig mit meiner Anwendung verknüpft ist, würde ich es lieber in meiner Anwendungsversion behalten. Einen Event-Handler für jede Anwendung in meiner Event-Manager-Version zu haben, wird wahrscheinlich schnell unordentlich werden.

+1

Ich weiß nicht viel über 'gen_event', aber der Fehler sieht aus wie' gen_event' versuchte 'zu nennen event_handler_a: init ([])' und entweder das Modul oder Diese Funktion wurde nicht auf diesem Erlang-Knoten definiert/geladen. – Dogbert

+0

@Dogbert Ich habe das vergessen. Wenn der Ereignismanager den init/1-Callback vom Event-Handler aus aufruft, muss er den Knotennamen angeben. Leider zeigt das Dokument 'add_handler (EventMgrRef, Handler, Args) -> Result' mit' Handler = Module | {Module, Id} ' – ITChap

+0

Ich denke, Sie können das als' Args' übergeben, also 'gen_event: add_handler (_, _, node1 @ host1)'. – Dogbert

Antwort

5

Nein, das ist nicht möglich. gen_event funktioniert ein bisschen anders als andere Verhaltensweisen, in dem der Code in Ihrem Callback-Modul (die Sie als Argument an gen_event:add_handler/3 übergeben) im gleichen Prozess als Ereignismanager ausgeführt wird. Wenn der Ereignismanager auf einem Remote-Knoten ausgeführt wird, wird daher der Ereignishandler auf demselben Knoten ausgeführt.

Eine Möglichkeit, dies zu erreichen, besteht darin, ein Event-Handler-Rückrufmodul zu erstellen, das Ereignisse an einen Prozess auf dem gewünschten Knoten weiterleitet. Sie könnten dann so etwas tun:

gen_event:add_handler({event_manager, [email protected]}, my_event_forwarder, [self()]). 
+0

Das habe ich mir gedacht. Ich könnte auch in der Lage sein, einen sehr generischen Handler zu erstellen, der ein 'fun()' als Init-Argument verwendet und einfach alle Ereignisse an dieses 'fun()' übergibt. Subskribieren würde bedeuten, immer dasselbe Handler-Modul mit verschiedenen 'fun()' hinzuzufügen, um verschiedene Dinge zu tun. – ITChap

+1

Beachten Sie, dass das Modul, in dem der Spaß definiert ist, auf dem Knoten geladen werden muss, an dem es aufgerufen wird. – legoscia

Verwandte Themen