From 29a5148dcb4ef361ebc1924abae743841e57906c Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Sun, 23 Apr 2023 23:56:23 +0200 Subject: [PATCH] GH-181 - Delay lookup of EventPublicationRegistry as much as possible. We now avoid to initialize the EventPublicationRegistry in the ApplicationEventMulticaster unless there is a transactional event listener interested in the event to be published. This should help us avoid premature initialization of the registry for application events published early in the application context bootstrap phase. --- ...PersistentApplicationEventMulticaster.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/PersistentApplicationEventMulticaster.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/PersistentApplicationEventMulticaster.java index d602f86c..b68d933b 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/PersistentApplicationEventMulticaster.java +++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/PersistentApplicationEventMulticaster.java @@ -94,12 +94,8 @@ public class PersistentApplicationEventMulticaster extends AbstractApplicationEv return; } - var txListeners = new TransactionalEventListeners(listeners); - var eventToPersist = getEventToPersist(event); - - registry.get().store(eventToPersist, txListeners.stream() // - .map(TransactionalApplicationListener::getListenerId) // - .map(PublicationTargetIdentifier::of)); + new TransactionalEventListeners(listeners) + .ifPresent(it -> storePublications(it, getEventToPersist(event))); for (ApplicationListener listener : listeners) { listener.onApplicationEvent(event); @@ -146,6 +142,15 @@ public class PersistentApplicationEventMulticaster extends AbstractApplicationEv return listener; } + private void storePublications(Stream> listeners, + Object eventToPersist) { + + var identifiers = listeners.map(TransactionalApplicationListener::getListenerId) // + .map(PublicationTargetIdentifier::of); + + registry.get().store(eventToPersist, identifiers); + } + private static Object getEventToPersist(ApplicationEvent event) { return PayloadApplicationEvent.class.isInstance(event) // @@ -257,5 +262,9 @@ public class PersistentApplicationEventMulticaster extends AbstractApplicationEv .findFirst() .ifPresent(callback); } + + public boolean hasListeners() { + return !listeners.isEmpty(); + } } }