2016-08-04 30 views
3

Mit CDI 2.0-Ereignis und @observesAsync mit einer Klasse und Qualifier, ist es möglich zu verfeinern, welche Beobachter benachrichtigt werden über eine Art Laufzeit zugewiesene Eigenschaft? Das heißt, ist es möglich zu spezifizieren, welcher einzelne Beobachter ausgelöst wird, indem man eine eindeutige Kennung verwendet, oder müssen alle Beobachter das Ereignis betrachten und entscheiden, ob es für sie war?CDI, Ist es möglich, @ObservesAsync durch Hinzufügen einer Qualifier-Eigenschaft zu filtern?

Antwort

3

Um Ihr gewünschtes Verhalten zu erreichen, verwenden Sie am besten Qualifier.

... ist es möglich, eine eindeutige Kennung durch die Verwendung ...

ausgelöst, die einzelnen Beobachter angeben wird

Es ist - ein einzigartiges Qualifikationsspiel benutzen, die keine anderen Beobachter auslöst. Es funktioniert nicht so, dass alle Beobachter das Ereignis "sehen". CDI filtert dies und liefert es nur an die Untergruppe, die für das Ereignis relevant ist, das Sie ausgelöst haben.

Unten ist ein ziemlich detailliertes Beispiel, wie Ereignis und Beobachter mit Qualifiern arbeiten; Bitte beachten Sie, dass dies sowohl mit synchronen als auch mit asynchronen Ereignissen möglich ist. Wie Injektionspunkte können Ereignisse Qualifier aufweisen. Sagen Sie bitte die folgenden Ereignisse haben:

@Inject Event<MyPayload> basic; 
@Inject @Awesome Event<MyPayload> awesome; 
@Inject @Tricky Event<MyPayload> tricky; 
@Inject @Awesome @Tricky Event<MyPayload> combined; 

Der Einfachheit halber wollen wir diese Veranstaltung einfach Brennen von <eventName>.fireAsync(new MyPayload()) bleiben. Jetzt für die Beobachter - diese können auch Qualifier haben. Die Gruppe der Qualifier legt fest, über welche Ereignisse sie benachrichtigt werden. So, hier ist eine Reihe von Beobachtern:

Nun zu dem Beobachter wird über welches Ereignis benachrichtigt werden. Die allgemeine Regel ist - Ein Beobachter Methode benachrichtigt werden, wenn die Menge der Beobachter-Qualifikation eine Teilmenge der gebrannten Veranstaltung Qualifier oder ein leerer Satz

Angenommen, Sie die Ereignisse über gefeuert:

  • asyncObserver1 wird benachrichtigt von alle diese Ereignisse, weil seine Reihe von Qualifikations wird eine leere
  • asyncObserver2 ist von awesome und combined Ereignisse benachrichtigt werden
  • asyncObserver3 wird von tricky und combined Ereignissen
  • asyncObserver4 wird nur das combined Ereignis benachrichtigt wird

Last but not least informiert werden, schlage ich Sie am CDI documentation Einblick in einen tieferen Einblick zu bekommen.