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);
+ }
+}