diff --git a/pom.xml b/pom.xml index a0297a77d..df044b8be 100644 --- a/pom.xml +++ b/pom.xml @@ -244,6 +244,12 @@ 3.8.0 test + + net.jcip + jcip-annotations + 1.0 + test + diff --git a/spring-cloud-sleuth-core/pom.xml b/spring-cloud-sleuth-core/pom.xml index 3caf750ef..67e3d2f8c 100644 --- a/spring-cloud-sleuth-core/pom.xml +++ b/spring-cloud-sleuth-core/pom.xml @@ -336,6 +336,11 @@ 20.0 test + + net.jcip + jcip-annotations + test + diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java index 2ac83145c..13ec0e0f8 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java @@ -83,7 +83,11 @@ enum MessageHeaderPropagation accessor.removeHeader(keyToRemove); if (accessor instanceof NativeMessageHeaderAccessor) { NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor; - nativeAccessor.removeNativeHeader(keyToRemove); + if (accessor.isMutable()) { + // 1184 native headers can be an immutable map + ensureNativeHeadersAreMutable(nativeAccessor) + .removeNativeHeader(keyToRemove); + } } else { Object nativeHeaders = accessor @@ -95,6 +99,26 @@ enum MessageHeaderPropagation } } + /** + * Since for some reason, the native headers sometimes are immutable even though the + * accessor says that the headers are mutable, then we have to ensure their + * mutability. We do so by first making a mutable copy of the native headers, then by + * removing the native headers from the headers map and replacing them with a mutable + * copy. Workaround for #1184 + * @param nativeAccessor accessor containing (or not) native headers + * @return modified accessor + */ + private static NativeMessageHeaderAccessor ensureNativeHeadersAreMutable( + NativeMessageHeaderAccessor nativeAccessor) { + Map> nativeHeaderMap = nativeAccessor.toNativeHeaderMap(); + nativeHeaderMap = nativeHeaderMap instanceof LinkedMultiValueMap ? nativeHeaderMap + : new LinkedMultiValueMap<>(nativeHeaderMap); + nativeAccessor.removeHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS); + nativeAccessor.setHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS, + nativeHeaderMap); + return nativeAccessor; + } + @Override public void put(MessageHeaderAccessor accessor, String key, String value) { try { @@ -116,7 +140,7 @@ enum MessageHeaderPropagation accessor.setHeader(key, value); if (accessor instanceof NativeMessageHeaderAccessor) { NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor; - nativeAccessor.setNativeHeader(key, value); + ensureNativeHeadersAreMutable(nativeAccessor).setNativeHeader(key, value); } else { Object nativeHeaders = accessor diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java index b3faf4ee5..9a385aa81 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java @@ -22,6 +22,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import brave.Span; import brave.Tracing; import brave.sampler.Sampler; +import net.jcip.annotations.NotThreadSafe; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Before; @@ -47,6 +48,7 @@ import static org.awaitility.Awaitility.await; @RunWith(SpringRunner.class) @SpringBootTest(classes = { ScheduledTestConfiguration.class }) @DirtiesContext +@NotThreadSafe public class TracingOnScheduledTests { @Autowired diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index 264dcd341..228a2c038 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -3,6 +3,7 @@ "-//Puppy Crawl//DTD Suppressions 1.1//EN" "https://www.puppycrawl.com/dtds/suppressions_1_1.dtd"> +