© DrHitch/Shutterstock.com
Shortcuts
CDI

13 Eventverarbeitung


Die Bereitstellung von Objekten durch den Container und ihre Injektion in Beans reduziert die Kopplung der Anwendungsteile untereinander deutlich: Eine benutzende Komponente „weiß“ nicht mehr, wie die benutzten Objekte herzustellen sind. Wird mit Interfaces gearbeitet, ist ihr sogar der konkrete Typ der verwendeten Objekte unbekannt.

Man kann Anwendungskomponenten noch weiter voneinander entkoppeln, indem man eine Event-basierte Kommunikation verwendet: Eine Komponente sendet bspw. aufgrund eines Zustandswechsels einen Event aus. Andere Komponenten reagieren darauf mit der Ausführung eines beliebigen Programmcodes. Die Komponenten „kennen“ einander nicht – das einzige verbindende Element ist der verarbeitete Event.

Events erzeugen

Events bestehen in CDI aus einem Java-Objekt und einer – ggf. leeren – Menge von Qualifiern. Sie werden mithilfe einer Event Source versendet. Das ist ein Objekt des Typs Event<T> (javax.enterprise.event.Event), das in die aufrufende Bean mit den gewünschten Qualifiern injiziert wird. Der Typparameter gibt den Typ der zu versendenden Java-Objekte – den Eventtyp – an (Listing 13.1).

public class CocktailModel
{

// zum Feuern von Inhouse-Bestell-Events
@Inject @Inhouse
private Event<CocktailOrder> cocktailInhouseOrderEvent;

// zum Feuern von Takeaway-Bestell-Events
@Inject @Takeaway
private Event<CocktailOrder> cocktailTakeawayOrderEvent;

Listing 13.1: Event Sources für Events des Typs „CocktailOrder“ mit verschiedenen Qualifiern

Der Versand – das „Feuern“ – von Events geschieht durch Aufruf der Methode fire der Event Source (Listing 13.2).

public class CocktailModel
{

public void bestellungAbschliessen(boolean takeaway)
{

this.cocktailInhouseOrderEvent.fire(this.cocktailOrder);

Listing 13.2: Feuern eines Events

Events verarbeiten

Zur Verarbeitung der gefeuerten Events wird eine Observer Method benötigt. Das ist eine Methode einer beliebigen CDI Bean, die einen mit @Observes (javax.enterprise.event.Observes) und den gewünschten Qualifiern annotierten Parameter hat. Der Parametertyp entscheidet zusammen mit den Qualifiern darüber, welche Events von der Methode empfangen werden: Es werden die Events berücksichtigt, deren Event Type dem Parameter zugewiesen werden kann und die mindestens die Qualifier des Parameters haben (Listing 13.3).

public class CocktailMixer
{
public void mixCocktail(@Observes CocktailOrder order)
{

}
}

public class TakeawayCounter
{
public void count(@Observes @Takeaway CocktailOrder order)
{

}
}

Listin...

Shortcuts
CDI

13 Eventverarbeitung

Die Bereitstellung von Objekten durch den Container und ihre Injektion in Beans reduziert die Kopplung der Anwendungsteile untereinander deutlich: Eine benutzende Komponente „weiß“ nicht mehr, wie die benutzten Objekte herzustellen sind. Wird mit Interfaces gearbeitet, ist ihr sogar der konkrete Typ der verwendeten Objekte unbekannt.

Shortcut Autorenteam


Die Bereitstellung von Objekten durch den Container und ihre Injektion in Beans reduziert die Kopplung der Anwendungsteile untereinander deutlich: Eine benutzende Komponente „weiß“ nicht mehr, wie die benutzten Objekte herzustellen sind. Wird mit Interfaces gearbeitet, ist ihr sogar der konkrete Typ der verwendeten Objekte unbekannt.

Man kann Anwendungskomponenten noch weiter voneinander entkoppeln, indem man eine Event-basierte Kommunikation verwendet: Eine Komponente sendet bspw. aufgrund eines Zustandswechsels einen Event aus. Andere Komponenten reagieren darauf mit der Ausführung eines beliebigen Programmcodes. Die Komponenten „kennen“ einander nicht – das einzige verbindende Element ist der verarbeitete Event.

Events erzeugen

Events bestehen in CDI aus einem Java-Objekt und einer – ggf. leeren – Menge von Qualifiern. Sie werden mithilfe einer Event Source versendet. Das ist ein Objekt des Typs Event<T> (javax.enterprise.event.Event), das in die aufrufende Bean mit den gewünschten Qualifiern injiziert wird. Der Typparameter gibt den Typ der zu versendenden Java-Objekte – den Eventtyp – an (Listing 13.1).

public class CocktailModel
{

// zum Feuern von Inhouse-Bestell-Events
@Inject @Inhouse
private Event<CocktailOrder> cocktailInhouseOrderEvent;

// zum Feuern von Takeaway-Bestell-Events
@Inject @Takeaway
private Event<CocktailOrder> cocktailTakeawayOrderEvent;

Listing 13.1: Event Sources für Events des Typs „CocktailOrder“ mit verschiedenen Qualifiern

Der Versand – das „Feuern“ – von Events geschieht durch Aufruf der Methode fire der Event Source (Listing 13.2).

public class CocktailModel
{

public void bestellungAbschliessen(boolean takeaway)
{

this.cocktailInhouseOrderEvent.fire(this.cocktailOrder);

Listing 13.2: Feuern eines Events

Events verarbeiten

Zur Verarbeitung der gefeuerten Events wird eine Observer Method benötigt. Das ist eine Methode einer beliebigen CDI Bean, die einen mit @Observes (javax.enterprise.event.Observes) und den gewünschten Qualifiern annotierten Parameter hat. Der Parametertyp entscheidet zusammen mit den Qualifiern darüber, welche Events von der Methode empfangen werden: Es werden die Events berücksichtigt, deren Event Type dem Parameter zugewiesen werden kann und die mindestens die Qualifier des Parameters haben (Listing 13.3).

public class CocktailMixer
{
public void mixCocktail(@Observes CocktailOrder order)
{

}
}

public class TakeawayCounter
{
public void count(@Observes @Takeaway CocktailOrder order)
{

}
}

Listin...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang