Best Practice Alternativen für Event-Handling

MR_UNIX

Bekanntes Mitglied
Hallo Leute,

für mein aktuelles Projekt suche ich noch Vorschläge, wie ich das Event-Handling umsetzen kann.

Natürlich habe ich selber schon ein wenig recherchiert - ich möchte mir ja nur Unterstützung suchen und nicht alles vorkauen lassen - aber da habe ich eigentlich ausschließlich das Observer-Observable Pattern gefunden.
Es gibt aber mehrere Gründe, warum mir dieses in meinem Kontext nicht wirklich gut gefällt:

  • Events sollen bei mir nur aus einer Klasse abgefeuert werden
  • Das "Observable" wäre die Hauptklasse, was nicht sonderlich schön ist
  • Versch. Events nicht wirklich schön umsetzbar aufgrund vorhergehender Fakten

Bei der Software, in die das Eventsystem integriert werden soll, ist eine Client-Server Anwendung. Events sollen dann bspw. ausgelöst werden, wenn ein Client sich anmeldet bzw. abmeldet, der Server crasht (Exception geworfen) oder ähnliches.

Ich würde mich sehr freuen, wenn ihr mir sinnvolle Alternativen für ein solches Event-Handling Prinzip nennen könntet. Am besten wäre es, wenn ihr direkt auch kleine Codebeispiele dazu schreiben könntet.
Bei weiteren Fragen stehe ich natürlich zur Verfügung.

Danke im Voraus!
 

Ruzmanz

Top Contributor
Ehrlich habe ich nicht ganz verstanden, warum das Observer Pattern nicht infrage kommt. Eine vereinfachte Form könnte so aussehen:

Interface:
Java:
public interface IEatable {
    public void eat(EatEvent event);
}

Zusätzliche Informationen, wenn die dem Listener übergeben werden (optinal). Am besten immutable gestalten:

Java:
public class EatEvent {
    private Fruit fruit;
    
    public EatEvent(Fruit fruit) {
        this.fruit = fruit;
    }

    public String getFruitName() {
        return fruit.getName();
    }
}

Zentrale Klasse, welche alle IEatable-Klassen kennt. Kann man z.B. als Singleton umsetzen. Oder man passt ein bisschen auf ...
Java:
publlic class FruitBasket {
    private ArrayList<IEatable> eatables;

    public void addFruit(Fruit fruit) {
         notifyAll(new EatEvent(fruit));
    }

    public void addEatableListener(IEatable eatable) {
        eatables.add(eatable);
    }

    public void notifyAll(EatEvent ev) {
        for(IEatable e: eatables) e.eat(ev);
    }
}

Java:
// FruitBasket b = new FruitBasket();
// b.addEatableListener(klasse1);
// b.addEatableListener(klasse2);
// b.addFruit(new Apple());
// --> Die Methode eat() wird von klasse1 und klasse2 aufgerufen.

Kann man noch einiges ausbauen, ist halt nur ein Grundgerüst.
 
Zuletzt bearbeitet:

turtle

Top Contributor
eine Client-Server Anwendung. Events sollen dann bspw. ausgelöst werden, wenn ein Client sich anmeldet bzw. abmeldet, der Server crasht (Exception geworfen) oder ähnliches.
DAS ist wohl ein grundsätzliches Problem. Und deine Beschreibung ist da nicht eindeutig, WAS genau passieren soll (im Client bzw. im Server).

Erstens ist wichtig welche Client/Server-Kommunikation du einsetzen möchtest, denn davon ist abhängig ob und wie die beiden Teile sich unterhalten können.

Du kannst dem Server mitteilen, das der Client nicht mehr da ist obwohl das schwieriger ist, weil ein Client ja auch einfach, ohne den Server zu benachrichtigen, abstürzen kann (Netzwerkkabel ziehen).

Noch schwieriger wird es, wenn der Server die Clients informieren soll, wenn einer der Clients verloren wurde. Oftmals wird diese Situation ignoriert, weil es halt SCHWIERIG ist. Wie stellst du sicher das der Server Informationen an die Clients schicken kann und wie behandelst du Probleme, wenn der Client die Informationen gerade nicht bearbeiten kann? (Daher updaten Clients ihre Informationen über aktuelle Clients, indem sie beim Server nachfragen.)

Diese Notifications über JVM-Grenzen hinweg sind von der eingesetzten Technik abhängig. Hast du eine Socket-Verbindung kannst du derartige Meldungen "leicht" hin-und herschicken. Aber wie geht das beispielsweise mit RMI?

Und ein Server-Crash ist für Notification-Events natürlich der GAU, denn es gibt keine Events mehr, die irgendwie zugestellt werden könnten.

Alles in allem ein aufwändiges Thema und du musst dir genauer den Workflow zwischen Client/Server überlegen und beschreiben.
 

MR_UNIX

Bekanntes Mitglied
Hallo,

danke für eure beiden umfangreichen Antworten. Beide haben mir bei meiner Problemstellung einen Fortschritt verschafft.

@Ruzmanz:
Deinen Vorschlag werde ich die Tage mal versuchen, in das bestehende System zu integrieren - wobei so weit ich das gesehen habe die Ähnlichkeit zum Observer/Observable Pattern doch recht ähnlich ist.

@turtle:
Das Eventhandling soll dazu dienen, dass - ähnlich wie bei Bukkit - bei bestimmten Ereignissen eben Plugins (oder auch integrierte Bestandteile im Server) informiert werden sollen, damit dann eine bestimmte Aktion ausgeführt werden kann. So wird zum Beispiel wenn ein Benutzer sich ausloggt ein Event ausgelöst und die Serveranwendung selbst reagiert mit einer Push-Mitteilung an die verbleibenden Clients. Ein Plugin soll dies zum Beispiel nutzen können, um die aktuelle Benutzerzahl abzurufen o.ä.

Die Kommunikation zwischen Server und Clients erfolgt über (SSL-)Sockets. In meinem Anwendungs-Szenario spielt das aber keine Rolle, da der Client wenn dann nur explizit durch Servermodule aber nicht durch das Event implizit informiert werden soll. Eine Abmeldung des Benutzers, die nicht geplant ist (wie bspw. dein "Kabelziehenbeispiel") wird so erkannt, dass Heartbeat Nachrichten gesendet werden - bekanntes Prinzip. Wenn die nicht beantwortet werden, wird der Client als "tot" eingestuft und vom Server aus abgemeldet.

Die Kommunikation bzw. die Anwendung an sich steht auch schon, es geht nur darum, in das bestehende System möglichst ohne großen Aufwand ein solches Event-Handling einzufügen. Generell wurde eine Art eigenes Protokoll auf Basis bestimmter Kommandos realisiert, welches explizit modular aufgebaut ist, damit Plugins sogar das Protokoll an sich und nicht nur die Funktionalität erweitern können. Genaue Quellcodebeispiele möchte ich hier aus gewissen Gründen nicht nennen.

Klar, ein Crash an sich kann durch ein Eventsystem nicht wirklich abgedeckt werden. Wenn man aber das Exception-Handling entsprechend aufbaut - und das ist der Fall - dann kann wenigstens im Falle einer solchen Ausnahme ein Event ausgelöst werden. Das ist hier auch das Ziel.

Ich hoffe, ich konnte alle Fragen klären.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
R Alternativen zu lucene Allgemeine Java-Themen 4
E JAVA Alternativen zur Datenbank? Allgemeine Java-Themen 7
T Glasspane oder alternativen Allgemeine Java-Themen 5
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
webracer999 Library für Textsuche (z. B. include/exclude, and/or)? Allgemeine Java-Themen 5
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
I OCR Library für Belegerkennung Allgemeine Java-Themen 7
farah GetterMathod für Farbkanäle Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
S Webservices für binäre Daten? Allgemeine Java-Themen 5
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
M API für PLZ Umkreissuche Allgemeine Java-Themen 3
1Spinne JDK 8 für Eclipse installieren Allgemeine Java-Themen 5
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
L Methoden Parser für gängige Datumsformate? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
F PI Regler für Heizung Allgemeine Java-Themen 7
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
Z Welches GUI Framework für Java ist aktuell? Allgemeine Java-Themen 16
N Convert.FromBase64 von C# für Java Allgemeine Java-Themen 11
N fixed-keyword von C# für Java Allgemeine Java-Themen 6
O Suche Scripter für alt:V Project! Allgemeine Java-Themen 0
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
O Suche Unterstützung für ein OpenSource-Projekt (grafischer Editor) Allgemeine Java-Themen 13
Kirby.exe Software für Graphische Visualisierung Allgemeine Java-Themen 20
B OOP Auslöser für NullPointerException Allgemeine Java-Themen 3
L Generator für einen Parser implementieren Allgemeine Java-Themen 13
DonMalte Ambitioniertes Projekt für Einsteiger & Motivierte Allgemeine Java-Themen 0
Kirby.exe Movement System für Spiel Allgemeine Java-Themen 13
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
Thallius Alternative für SwingWorker Allgemeine Java-Themen 5
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
H OOP Setting(config) für Applikation sicheren? Allgemeine Java-Themen 9
OnDemand PDF Libary für Formulare Allgemeine Java-Themen 7
S Warmup für Lineare-Suche mit Zeitmessung Allgemeine Java-Themen 2
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
M Brainstorming für mein Projekt Allgemeine Java-Themen 30
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
C Bibliotheken für Algorithmische Geometrie Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
I Overlay für Spiele Allgemeine Java-Themen 5
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
I GUI für kleine Pop-Ups unter Windows Allgemeine Java-Themen 1
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
HarleyDavidson Best Practice Wohin mit der Konfigurationsdatei für Desktopapplikationen? Allgemeine Java-Themen 3
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben