Alternativen oder ähnliche Projekte wie EventBus

Hallo!

Kennt wer von euch EventBus ( https://eventbus.dev.java.net/ )? Ich suche nach ähnlichen Projekten wie dieses. Vielleicht kann mir jemand Alternativen dazu oder ähnliche Projekte nennen?

Es geht um ein Nachrichtensystem um Nachrichten zu bestimmten Ereignissen zu verschicken, die dann von „Listenern“ verarbeitet werden können. Was mich am EventBus genau stört bzw. mir fehlt ist die Möglichkeit, Topics und Events, auf die sich Listener registrieren können, zu kombinieren, um einen Listener an verschiedene Topics und / oder verschiedene Events zu binden.

Danke
McPringle

Hallo,

deine Frage erinnert mich an JMS und Apache ActiveMQ als eine Implementierung davon. Vielleicht hilft dir das weiter?

http://activemq.apache.org

Ciao, Bill

Hallo!

http://activemq.apache.org

Danke für deinen Tipp - auf das Projekt bin ich mittlerweile auch gestossen. Leider haben alle diese System ein grosses Problem - das Verschicken von Nachrichten, auch über mehrere JVM-Instanzen oder gar Server hinweg, die auf Antwort warten müssen, ist nur sehr schwierig oder überhaupt nicht möglich.

Beispiel bei einer Web-Anwendung „Dateimanager“ (da lässt sich das gut dran erklären): Im Client (Webbrowser) klickt ein User auf einen Löschen-Button. Dieser schickt eine Message „Ich möchte das Verzeichnis löschen“ an den Server. Dieser sendet die Message an alle darauf registrierten Listener, die auch über mehrere Server verteilt sein können (clustering). Ein Listener antwortet mit „ja, löschen erlaubt“, ein weiterer mit „Rückfrage: Das Verzeichnis enthält 25 Dateien, diese werden automatisch mit gelöscht. Möchten Sie das?“

Der Client wartet letztendlich auf die Antwort und stellt bei Bedarf die Rückfrage dar, welche dann wieder die Antwort „Ja, das will ich“ an die Listener übermittelt.

Ein solches Kontrukt ist mit den uns bekannten Systemen nur sehr schwer abzubilden. Wir haben eine Woche lang EventBus, ActiveMQ und XMLBlaster evaluiert. Keines davon kann das von Haus aus auf anwenderfreundliche (für den Programmierer) Art und Weise (falls überhaupt). Daher haben wir uns entschlossen, ein System zu entwickeln, dass dies kann bzw. genau genommen die gewünschte Funktionalität kapselt und in das sich andere Systeme per Plugin einbinden lassen, um den eigentlichen Nachrichtentransport durchzuführen (das Rad muss man ja nun nicht noch mal erfinden).

Es steht auch die Überlegung im Raum, das Ergebnis als Open Source zu veröffentlichen, da wir uns nicht vorstellen können, die einzigen zu sein, die dieses „Problem“ haben und es elegant, universell, erweiterbar und programmiererfreundlich gelöst haben möchten.

Ciao
McPringle

Hi,

Danke für deinen Tipp - auf das Projekt bin ich mittlerweile
auch gestossen. Leider haben alle diese System ein grosses
Problem - das Verschicken von Nachrichten, auch über mehrere
JVM-Instanzen oder gar Server hinweg, die auf Antwort warten
müssen, ist nur sehr schwierig oder überhaupt nicht möglich.

Warum soll die Kommunikation über Rechner- und Netzwerkgrenzen hinweg nicht funzen?
Der von dir beschriebene Anwendungsfall ist aus meiner Sicht schon JMS lösbar (bin nicht so der JMS-Experte, aber das ist ja nur ein Prinzip):
Wenn der Server die Kenntnis der Listener hat, dann kann er sowohl einen Vorwärts- als auch Rückwärtskanal aufbauen. Ob dies nun via Queue oder Topic gelöst wird, sei mal dahingestellt.
Und beim Versenden des Events kann er ja eine angemessene Zeit auf Antwort von allen Listenern warten und diese dann verwerten. Thema Multithreading.

Zumindest wäre dies jetzt mein Ansatz, das Problem zu lösen. Aber ich komme nicht aus der Web-Ecke, daher kann ich auch falsch liegen.

Dennoch wäre es interessant, wenn ihr da schon etwas eigenes stricken wollt, wenn du hier entsprechende Infos dazu hinterlässt.

Ciao, Bill

Hi!

Warum soll die Kommunikation über Rechner- und Netzwerkgrenzen
hinweg nicht funzen?

„Funzen“? Süss… *streichel*

Sie funktioniert, ist aber meines Erachtens nach für die Anwender viel zu kompliziert gelöst.

Der von dir beschriebene Anwendungsfall ist aus meiner Sicht
schon JMS lösbar (bin nicht so der JMS-Experte, aber das ist
ja nur ein Prinzip):

Klar, aber eben viel komplizierter als es sein müsste und zudem noch abhängig von der Implementierung. Die Standardimplementierung von SUN ist kostenpflichtig, die Alternativen sind nicht komplett oder interpretieren Teile der Spezifikation unterschiedlich, so dass ein späterer Wechsel zu einem anderen System oft nicht bzw. nur mit sehr viel Aufwand möglich ist.

Wenn der Server die Kenntnis der Listener hat, dann kann er
sowohl einen Vorwärts- als auch Rückwärtskanal aufbauen. Ob
dies nun via Queue oder Topic gelöst wird, sei mal
dahingestellt.

Klar geht das, aber diese ganze Arbeit (Öffnen der Kanäle auch für die Antwort, Synchronisation bei synchroner Kommunikation, Sammeln der Antworten von mehreren Listenern, Beachten von Timeouts falls kein Listener antwortet, etc.) bleibt beim Anwender hängen! Der kann bei keiner mir bekannten Implementierung so etwas einfaches machen wie beispielsweise:

IrgendEinObject response = MessageSystem.publish(kanal, nachricht, timeout);

Und beim Versenden des Events kann er ja eine angemessene Zeit
auf Antwort von allen Listenern warten und diese dann
verwerten. Thema Multithreading.

Siehe oben - man muss sich um alles selbst kümmern. Das führt meiner Meinung nach den Sinn einer solchen Library ad absurdum, da sie dem Anwender die Arbeit nicht erleichtert.

Zumindest wäre dies jetzt mein Ansatz, das Problem zu lösen.
Aber ich komme nicht aus der Web-Ecke, daher kann ich auch
falsch liegen.

Das ist noch ein zusätzliches Problem. Bei webbasierten Anwendungen sind so viele verschiedene Techniken im Einsatz, die zu einem System zusammen setzen muss, dass eine synchrone Kommunikation von einer webbasierten Anwendung, die abhängig von der Aktion des Anwenders im Browser eine Aktion auf dem Server auslöst, deren Antwort auf dem Client verarbeitet werden soll, eine ziemlich komplizierte Sache darstellt.

Beispiel:

Der User markiert im Browser einen Datensatz, den er löschen möchte und klickt auf „Löschen“. Dies löst im Browser ein JavaScript aus, das eine Nachricht mit dem Kontext (diesen Datensatz löschen) an den Server schickt. Dieser publiziert diese Nachricht auf dem Server (z.B. Tomcat), woraufhin die darauf registrierten Listener (z.B. in Java entwickelt) anlaufen, die Nachricht verarbeiten und darauf reagieren. Einer der Listener schickt ein „ok, es darf gelöscht werden“, ein anderer Listener schickt ein „Es sind Abhängigkeiten vorhanden. Sollen diese auch gelöscht werden?“. Diese Antworten werden vom Message-System gesammelt und als Antwort an den Client geschickt. Dieser hat brav gewartet und muss nun einen Dialog für den User anzeigen, z.B.: „In dem Ordner XY befinden sich noch 7 Dateien. Möchten Sie den Ordner wirklich inklusive der Dateien löschen?“. Antwortet der User mit „Ja“, wird wieder eine Nachricht an den Server geschickt, welcher den Löschvorgang dann ausführt.

Versuche dieses, bei Webanwendungen alltägliche, Szenario mal mit einer der vorhandenen Implementierung (egal, ob JMS oder nicht) abzubilden. Du codest dich für diese eine Aktion zu Tode! Ergo: Viel zu kompliziert in der Anwendung.

Dennoch wäre es interessant, wenn ihr da schon etwas eigenes
stricken wollt, wenn du hier entsprechende Infos dazu
hinterlässt.

Gerne - wir haben bei uns in der Firma entschieden, eine Akstraktionsschicht zu entwickeln, die auf bekannten Technologien aufsetzt (z.B. Prototype, Apache ActiveMQ), die sich jedoch austauschen lassen (Plugin-Prinzip), welche für den Anwender (Entwickler) jedoch ungleich einfacher zu benutzen ist und obige Szenarien kapselt.

cu
McPringle