From 85c5206cd3090b3db43c40ad0ef3a557d9a74062 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 19 Nov 2024 23:50:45 +0100 Subject: [PATCH] GH-936 - Make sure ModuleTracingBeanPostProcessor is executed early. We now explicitly declare an order for the MTBPP so that it gets registered for execution before the ones that create infrastructure for message listeners so that those already see the potentially proxied instance and invocations actually invoke the advice creating the traces. --- spring-modulith-observability/pom.xml | 6 ++++++ .../ModuleTracingBeanPostProcessor.java | 12 +++++++++++- .../ModuleTracingBeanPostProcessorUnitTests.java | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spring-modulith-observability/pom.xml b/spring-modulith-observability/pom.xml index 86fe390a..d8ce37bf 100644 --- a/spring-modulith-observability/pom.xml +++ b/spring-modulith-observability/pom.xml @@ -99,6 +99,12 @@ test + + org.springframework.amqp + spring-rabbit + test + + diff --git a/spring-modulith-observability/src/main/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessor.java b/spring-modulith-observability/src/main/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessor.java index 510c4a64..53cab561 100644 --- a/spring-modulith-observability/src/main/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessor.java +++ b/spring-modulith-observability/src/main/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessor.java @@ -33,6 +33,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.Ordered; import org.springframework.modulith.runtime.ApplicationModulesRuntime; import org.springframework.util.Assert; @@ -42,7 +43,7 @@ import org.springframework.util.Assert; * * @author Oliver Drotbohm */ -public class ModuleTracingBeanPostProcessor extends ModuleTracingSupport implements BeanPostProcessor { +public class ModuleTracingBeanPostProcessor extends ModuleTracingSupport implements BeanPostProcessor, Ordered { public static final String MODULE_BAGGAGE_KEY = "org.springframework.modulith.module"; @@ -70,6 +71,15 @@ public class ModuleTracingBeanPostProcessor extends ModuleTracingSupport impleme this.factory = factory; } + /* + * (non-Javadoc) + * @see org.springframework.core.Ordered#getOrder() + */ + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE - 50; + } + /* * (non-Javadoc) * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, java.lang.String) diff --git a/spring-modulith-observability/src/test/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessorUnitTests.java b/spring-modulith-observability/src/test/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessorUnitTests.java index 42fe2745..747dcabe 100644 --- a/spring-modulith-observability/src/test/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessorUnitTests.java +++ b/spring-modulith-observability/src/test/java/org/springframework/modulith/observability/ModuleTracingBeanPostProcessorUnitTests.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.*; import example.sample.SampleProperties; import org.junit.jupiter.api.Test; +import org.springframework.amqp.rabbit.annotation.RabbitListenerAnnotationBeanPostProcessor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.modulith.runtime.ApplicationModulesRuntime; @@ -50,4 +51,15 @@ class ModuleTracingBeanPostProcessorUnitTests { assertThat(result).isSameAs(bean); } + + @Test // GH-936 + void processorIsRegisteredBefore() { + + var rabbitProcessor = new RabbitListenerAnnotationBeanPostProcessor(); + var tracingProcessor = new ModuleTracingBeanPostProcessor(mock(ApplicationModulesRuntime.class), () -> null, + new DefaultListableBeanFactory()); + + assertThat(rabbitProcessor.getOrder()).isGreaterThan(tracingProcessor.getOrder()); + + } }