diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java index 4e8bb6d13..3f95197b0 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java @@ -209,8 +209,7 @@ public final class TracingChannelInterceptor extends ChannelInterceptorAdapter private Message outputMessage(Message originalMessage, Message retrievedMessage, MessageHeaderAccessor additionalHeaders) { - MessageHeaderAccessor headers = MessageHeaderAccessor - .getMutableAccessor(originalMessage); + MessageHeaderAccessor headers = mutableHeaderAccessor(originalMessage); if (originalMessage instanceof ErrorMessage) { ErrorMessage errorMessage = (ErrorMessage) originalMessage; headers.copyHeaders(MessageHeaderPropagation.propagationHeaders( @@ -412,6 +411,11 @@ public final class TracingChannelInterceptor extends ChannelInterceptorAdapter } private MessageHeaderAccessor mutableHeaderAccessor(Message message) { + MessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, + MessageHeaderAccessor.class); + if (accessor != null && accessor.isMutable()) { + return accessor; + } MessageHeaderAccessor headers = MessageHeaderAccessor.getMutableAccessor(message); headers.setLeaveMutable(true); return headers; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingMethodMessageHandlerAdapter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingMethodMessageHandlerAdapter.java index 6167050dd..ebdee8e65 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingMethodMessageHandlerAdapter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingMethodMessageHandlerAdapter.java @@ -138,10 +138,19 @@ final class MessageConsumerRequest extends ConsumerRequest { MessageConsumerRequest(Message delegate, Getter getter) { this.delegate = delegate; - this.mutableHeaders = MessageHeaderAccessor.getMutableAccessor(delegate); + this.mutableHeaders = mutableAccessor(delegate); this.getter = getter; } + private MessageHeaderAccessor mutableAccessor(Message message) { + MessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, + MessageHeaderAccessor.class); + if (accessor != null && accessor.isMutable()) { + return accessor; + } + return MessageHeaderAccessor.getMutableAccessor(delegate); + } + @Override public Span.Kind spanKind() { return Span.Kind.CONSUMER;