Jeśli moja strona Ci pomogła, i chcesz aby była bardziej rozwijana, wesprzyj mnie
buy me a coffee
|
Zdarzenia synchroniczne:
Możemy je wywołać przez klasę CDI lub przez wstrzyknięcie referencji Event<>
Wywołanie przez klasę CDI zdarzenia wykonujemy przez metodę:
CDI.current().getBeanManager().fireEvent(event, qualifiers);
Wywołanie przez wstrzyknięcie referencji Event<> dla zdarzeń synchronicznych:
public class MyEvent {
private String name;
public MyEvent(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@Named
@ConversationScope
public class EventTest {
@Inject
private Event<MyEvent> myEvent;
public static void main(String[] args) {
myEvent.fire(new MyEvent("Moje zdarzenie"));
}
}
@Named
@ConversationScope
public class EventObserve {
private void onEvent(@Observes MyEvent event) {
System.out.println(event.getName());
}
}
Adnotacja Observe może mieć dwa parametry: notifyObserver i during.
@Observes(notifyObserver = Reception.IF_EXISTS))
Reception domyślnie ma wartość ALWAYS, oznacza że zdarzenie wykonane jest zawsze.
Reception.IF_EXISTS oznacza że zdarzenie zostanie wykonane jeżeli bean został stworzony (czyli odwołaliśmy się do niego).
Drugi parametr - during (domyślnie IN_PROGRESS) - @Observes(during=IN_PROGRESS), może posiadać następujące wartości:
IN_PROGRESS - wywołane observes natychmiast
AFTER_SUCCESS - jeżeli transakcja zakończona sukcesem
AFTER_FAILURE - jeżeli transakcja zakończona błędem
AFTER_COMPLETION - po zakończeniu transakcji
BEFORE_COMPLETION - przed rozpoczęciem transakcji
Zdarzenia asynchroniczne:
Wdarzenie możemy wywołać przez klasę CDI:
CDI.current().getBeanManager().getEvent().select(qualifiers).fireAsync(event);
Wywołanie przez wstrzyknięcie referencji Event<> dla zdarzeń asynchronicznych:
public class MyEvent {
private String name;
public MyEvent(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@Named
@ConversationScope
public class EventTest {
@Inject
private Event<MyEvent> myEvent;
public static void main(String[] args) {
myEvent.fireAsync(new MyEvent("Moje zdarzenie"));
}
}
@Named
@ConversationScope
public class EventObserve {
private void onEvent(@ObservesAsync MyEvent event) {
System.out.println(event.getName());
}
}
Nie musimy wstrzykiwać referencji Event, możemy stworzyć pomocniczą klasę Events którą będziemy używali do uruchomienia zdarzenia.
package pl.edu.java.cdi;
import java.lang.annotation.Annotation;
import javax.enterprise.inject.spi.CDI;
public final class Events {
private Events() {
}
public static void fire(Object event, Annotation... qualifiers) {
CDI.current().getBeanManager().fireEvent(event, qualifiers);
}
public static void fireAsync(Object event, Annotation... qualifiers) {
CDI.current().getBeanManager().getEvent().select(qualifiers).fireAsync(event);
}
}
Wywołane zdarzenie synchroniczne, przez klasę pomocniczą Events.
public class MyEvent {
private String name;
public MyEvent(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@Named
@ConversationScope
public class EventTest {
public static void main(String[] args) {
Events.fire(new MyEvent("Moje zdarzenie"));
}
}
@Named
@ConversationScope
public class EventObserve {
private void onEvent(@Observes MyEvent event) {
System.out.println(event.getName());
}
}
|