CDI Events – Das Observer Pattern in Java EE 6

Veröffentlicht in: Java, JEE 6 | 2

CDI Events können als ein neues Architekturmuster für Java EE 6 Anwendungen gesehen werden, dass am meisten dem Observer Pattern ähnelt. Auch hier gibt es ein zu überwachendes Objekt, auf welches verschiedenste Komponenten reagieren, deren Implementierung aber unbekannt bleiben soll.

Um dies zu ermöglichen benötigt das zu überwachende Objekt Möglichkeiten zum Registrieren und Entfernen von sogenannten Observern, welche bei bestimmten Änderungen des Objektes benachrichtigt werden.

Bei CDI Events reichen einfache Annotations aus, um die Observer im CDI Kontext zu registrieren. Eine Registrierung beim überwachten Objekt selbst, ist nicht mehr nötig.

Dieses Objekt, bzw. Event ist ein ganz normales POJO mit beliebigen Attributen und entsprechenden getter– und setter Methoden.

public class UserEvent {

private String username;

public UserEvent() {}

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}

Um das Event zu feuern, auf welches anschließend von den Observern reagiert werden soll, ist folgendes Code Fragment nötig:

 @Inject
private Event<UserEvent> event;

public void doSomething() {
event.fire(new UserEvent(„Mustermann“));
}

Das Registrieren von Observern im CDI Kontext erfolgt mittels der Annotation @Observes und dem Event als Übergabe-Parameter. Der Observer kann nun seine Aufgabe verrichten und dabei auf das Event zugreifen. Die Implementierung eines Interfaces ist nicht mehr nötig:

public class UserHandler {
public void handleUser(@Observes UserEvent event) {
// do what you have to do …
}
}

Soll die Abarbeitung innerhalb eines Observers asynchron erfolgen, d.h. nach dem Aufruf der fire-Methode des Events nicht auf den Observer gewartet werden, kann dies mit der Annotation @Asynchronous innerhalb des Observers definiert werden:

@Stateless
public class UserHandler {

@Asynchronous
public void handleUser(@Observes UserEvent event) {
// do what you have to do … but asynchronously
}
}

Mit Hilfe von CDI Events kann man die Software-Architektur recht einfach entkoppeln und hat eine Möglichkeit geschaffen, leicht Funktions-Erweiterungen implementieren zu können.

Bereits vor CDI gab es Frameworks, die Events unterstützt haben. Hier sei das Axon Framework (CQRS – Command Query Responsibility Segregation) genannt, wobei hier das Event-, bzw. Command-Handling nur eine Komponente von vielen war.

Ganz neu ist die Event Idee auf jeden Fall nicht, nun hat sie aber ihren Weg in den Java EE Standard gefunden.

2 Antworten

  1. Raffaele Merico

    Besten Dank für diesen Beitrag.
    Im Zusammenhang mit einem neuen Softwareentwicklungsvorhaben habe ich mich mit dem Gedanken getragen, CQRS bzw. Axon anzuwenden. Da ich herausfinden wollte, ob Axon und JEE6 vereinbar sind, habe ich im Google nach „axon jee6“ gesucht und bin auf diesen Artikel gestossen. Es stellt sich für mich nun folgende Fragen:
    Kann ich mit JEE6 und den CDI Events eine Anwendung mit CQRS-Architektur aufbauen, ohne auf Axon aufbauen zu müssen?

  2. Martin Zimmermann

    Mit CDI-Events läßt sich lediglich ein kleiner Teilbereich vom CQRS-Framework abbilden. Beide haben die Möglichkeit Events synchron bzw. asynchron zu feuern und mit entkoppelten Eventhandlern abzuarbeiten.

    Sofern dies ausreicht, bietet sich die JEE6 Lösung natürlich an, da man hier keine weiteren Libraries einbinden muss.

    Das CQRS Pattern beinhaltet darüber hinaus, noch weitere Aspekte, die mit JEE6 Komponenten nicht abbildbar sind.

    Ansonsten würde mir aber kein Grund einfallen, warum CQRS nicht in einer JEE6 Umgebung eingesetzt werden könnte.