From b4bb5416497a7cebbd4f9985cfddf37583ed1cc0 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Sun, 19 Nov 2023 21:44:37 +0100 Subject: [PATCH] GH-372 - Propagate original exception from CompletionRegisteringAdvisor. We now propagate potentially occurring exceptions in CompletionRegisteringAdvisor to make sure the standard exception handling facilities kick in, both for synchronous and asynchronous listener invocations. This implies that during republication we need to handle exceptions to make sure that failing synchronous listeners to not prevent the submission of subsequent publications. We currently log such exceptions into error. --- .../support/CompletionRegisteringAdvisor.java | 7 +++---- ...PersistentApplicationEventMulticaster.java | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/CompletionRegisteringAdvisor.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/CompletionRegisteringAdvisor.java index aaa669b1..36054b8a 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/CompletionRegisteringAdvisor.java +++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/support/CompletionRegisteringAdvisor.java @@ -23,7 +23,6 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.aop.Advisor; import org.springframework.aop.MethodMatcher; import org.springframework.aop.Pointcut; import org.springframework.aop.support.AbstractPointcutAdvisor; @@ -41,8 +40,8 @@ import org.springframework.util.Assert; import org.springframework.util.ConcurrentLruCache; /** - * An {@link Advisor} to decorate {@link TransactionalEventListener} annotated methods to mark the previously registered - * event publications as completed on successful method execution. + * An {@link org.springframework.aop.Advisor} to decorate {@link TransactionalEventListener} annotated methods to mark + * the previously registered event publications as completed on successful method execution. * * @author Oliver Drotbohm */ @@ -177,7 +176,7 @@ public class CompletionRegisteringAdvisor extends AbstractPointcutAdvisor { method, o_O.getMessage()); } - return result; + throw o_O; } // Mark publication complete if the method is a transactional event listener. 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 cfa29e41..c3df146f 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 @@ -192,7 +192,8 @@ public class PersistentApplicationEventMulticaster extends AbstractApplicationEv }); } - private void doResubmitUncompletedPublicationsOlderThan(@Nullable Duration duration, Predicate filter) { + private void doResubmitUncompletedPublicationsOlderThan(@Nullable Duration duration, + Predicate filter) { var message = duration != null ? "" : " older than %s".formatted(duration); var registry = this.registry.get(); @@ -206,8 +207,20 @@ public class PersistentApplicationEventMulticaster extends AbstractApplicationEv LOGGER.debug(getConfirmationMessage(publications) + " found."); publications.stream() // - .filter(filter) // - .forEach(this::invokeTargetListener); + .filter(filter) // + .forEach(it -> { + + try { + + invokeTargetListener(it); + + } catch (Exception o_O) { + + if (LOGGER.isErrorEnabled()) { + LOGGER.error("Error republishing event publication " + it, o_O); + } + } + }); } private static ApplicationListener executeListenerWithCompletion(EventPublication publication,