diff --git a/cdi/events-async/pom.xml b/cdi/events-async/pom.xml index 46c83de..3018a99 100644 --- a/cdi/events-async/pom.xml +++ b/cdi/events-async/pom.xml @@ -9,5 +9,12 @@ events-async Java EE 8 Samples: CDI - Events Async - + + + org.awaitility + awaitility + 3.1.6 + test + + diff --git a/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/MyEvent.java b/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/MyEvent.java new file mode 100644 index 0000000..2069894 --- /dev/null +++ b/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/MyEvent.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) [2019] Payara Foundation and/or its affiliates. + */ + +package org.javaee8.cdi.events.async.startup; + +import java.io.Serializable; + +public class MyEvent implements Serializable { + + private String source; + + public MyEvent(String source) { + this.source = source; + } + + public String getSource() { + return source; + } +} diff --git a/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/ObserverAtStartup.java b/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/ObserverAtStartup.java new file mode 100644 index 0000000..738f575 --- /dev/null +++ b/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/ObserverAtStartup.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) [2019] Payara Foundation and/or its affiliates. + */ + +package org.javaee8.cdi.events.async.startup; + +import javax.annotation.PostConstruct; +import javax.ejb.Singleton; +import javax.enterprise.event.Observes; +import javax.enterprise.event.ObservesAsync; +import java.util.logging.Logger; + +import static java.util.logging.Level.INFO; + +@Singleton +public class ObserverAtStartup { + + private static final Logger LOG = Logger.getLogger(ObserverAtStartup.class.getName()); + + private boolean received; + + @PostConstruct + public void init() { + LOG.info("Initiating bean public class ObserverAtStartup"); + } + + public void trigger(@ObservesAsync MyEvent evt) { + LOG.log(INFO, "ObserverAtStartup received event from {0}", evt.getSource()); + this.received = true; + } + + public boolean isReceived() { + return received; + } +} diff --git a/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/ProducerAtStartup.java b/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/ProducerAtStartup.java new file mode 100644 index 0000000..b380916 --- /dev/null +++ b/cdi/events-async/src/main/java/org/javaee8/cdi/events/async/startup/ProducerAtStartup.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) [2019] Payara Foundation and/or its affiliates. + */ + +package org.javaee8.cdi.events.async.startup; + +import javax.annotation.PostConstruct; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.enterprise.event.Event; +import javax.inject.Inject; +import java.util.logging.Level; +import java.util.logging.Logger; + +@Startup +@Singleton +public class ProducerAtStartup { + + private static final Logger LOG = Logger.getLogger(ProducerAtStartup.class.getName()); + + @Inject + Event evt; + + @PostConstruct + public void init() { + LOG.info("ProducerAtStartup init"); + fireEvent(); + } + + public void fireEvent(){ + evt.fireAsync(new MyEvent("ProducerAtStartup")).whenComplete((e, t) -> { + if (t != null) { + LOG.log(Level.SEVERE, "Event dispatch failed", t); + } else { + LOG.info("Event dispatch succeeded"); + } + }); + LOG.info("fireAsync done"); + } +} diff --git a/cdi/events-async/src/test/java/org/javaee8/cdi/events/async/startup/AsyncAtStartupTest.java b/cdi/events-async/src/test/java/org/javaee8/cdi/events/async/startup/AsyncAtStartupTest.java new file mode 100644 index 0000000..e16a2b7 --- /dev/null +++ b/cdi/events-async/src/test/java/org/javaee8/cdi/events/async/startup/AsyncAtStartupTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) [2019] Payara Foundation and/or its affiliates. + */ + +package org.javaee8.cdi.events.async.startup; + +import org.awaitility.Awaitility; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.inject.Inject; + +import java.util.concurrent.TimeUnit; + +import static org.awaitility.Awaitility.await; + +@RunWith(Arquillian.class) +public class AsyncAtStartupTest { + + @Deployment + public static WebArchive deployment() { + return ShrinkWrap.create(WebArchive.class) + .addPackage(ProducerAtStartup.class.getPackage()) + .addPackages(true, Awaitility.class.getPackage()); + } + + @Inject + ObserverAtStartup observer; + + @Test + public void startupEventIsEventuallyObserved() { + await().atMost(5, TimeUnit.SECONDS).until(observer::isReceived); + } +}