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">
+