2017-02-03 2 views
0

Ich teste die neue CDI2.0 Pre-Release und ich erwarte das BeanManager der Lage sein, asynchron Ereignisse auszulösen.CDI2.0 Warum kann der BeanManager keine asynchronen Ereignisse auslösen?

@Inject 
BeanManager beanManager; 

public void fireEvents() { 
     for (int i = 0; i < 10; i++) { 
      beanManager.fireEvent(new LightEvent("Light Event " + i)); 
      beanManager.fireEvent(new HeavyEvent("Heavy Event " + i)); 
     } 
    } 

Als ich async Ereignisse testen wollte, sah ich, dass die BeanManager kein fireAsync() -Methode hat:

In CDI 1.2 ich dies zu tun war. Stattdessen muss ich die Ereignisse andersherum auslösen:

@Inject 
private Event<LightEvent> lightEvent; 

@Inject 
private Event<HeavyEvent> heavyEvent; 

public void fireAsyncEvents() { 
    for (int i = 0; i < 10; i++) { 
     lightEvent.fireAsync(new LightEvent("light " + i)); 
     heavyEvent.fireAsync(new HeavyEvent("heavy " + i)); 
    } 
} 

Jetzt funktioniert das gut, aber ich muss die Ereignisse zuerst definieren. Gibt es Pläne, eine fireAsync() -Methode zum Beanmanager hinzufügen?

Antwort

0

Weil eine Entscheidung getroffen wurde, um BeanManager (BM) so viel aufzublähen. Um weiter zu gehen, gab es Leute, die nach fireAsync fragen, sowie Leute, die nach der Option fragen, das Ereignis direkt von BM mit ausgewählten Qualifiern oder Typ oder Typ und Qualifikanten zu feuern. Alle von ihnen sind gültige Anforderungen aber das Hinzufügen all dies auf BM noch diesen „uber“ Einstiegspunkt würde aufblasen.

Daher wurde eine Entscheidung getroffen, stattdessen BeanManager#getEvent() zu erstellen, von dem Sie direkt in eine Event Schnittstelle gelangen. Von dort können Sie select(..) tun basierend auf gewünschten Qualifikations/Typen (oder lassen Sie es Standard) und Sie dann fire (für Synchronisationsereignisse) oder fireAsync (für async).

Um meine obigen Aussagen zu unterstützen, können Sie mehr in verwandten CDI issue lesen oder the pull request direkt überprüfen.

Also, was Sie nach ist schon da und sieht wohl so aus:

@Inject 
BeanManager bm; 

public void myMethod() { 
    // default one 
    bm.getEvent().fireAsync(new MyPayload()); 
    // with selections of subtype and qualifiers 
    bm.getEvent().select(MyType.class, MyQualifier.class).fireAsync(new MyPayload()); 
} 
Verwandte Themen