Stop leaving mutability of headers for non stomp messages

with this change we're returning immutable headers of non stomp messages. That way timestamp and id of the message will be set. For stomp messages the headers still have to be mutable

related to gh-276

fixes gh-978
This commit is contained in:
Marcin Grzejszczak
2018-05-16 12:58:44 +02:00
parent 50cb889f45
commit 4ff445cf02
2 changed files with 29 additions and 4 deletions

View File

@@ -33,6 +33,7 @@ import org.springframework.integration.context.IntegrationObjectSupport;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.MessagingException;
import org.springframework.messaging.support.ChannelInterceptorAdapter;
import org.springframework.messaging.support.ErrorMessage;
@@ -154,10 +155,17 @@ public final class TracingChannelInterceptor extends ChannelInterceptorAdapter
if (originalMessage.getPayload() instanceof MessagingException) {
headers.copyHeaders(MessageHeaderPropagation.propagationHeaders(additionalHeaders.getMessageHeaders(),
this.tracing.propagation().keys()));
return new ErrorMessage((MessagingException) originalMessage.getPayload(), headers.getMessageHeaders());
return new ErrorMessage((MessagingException) originalMessage.getPayload(),
isWebSockets(headers) ? headers.getMessageHeaders() : new MessageHeaders(headers.getMessageHeaders()));
}
headers.copyHeaders(additionalHeaders.getMessageHeaders());
return new GenericMessage<>(retrievedMessage.getPayload(), headers.getMessageHeaders());
return new GenericMessage<>(retrievedMessage.getPayload(),
isWebSockets(headers) ? headers.getMessageHeaders() : new MessageHeaders(headers.getMessageHeaders()));
}
private boolean isWebSockets(MessageHeaderAccessor headerAccessor) {
return headerAccessor.getMessageHeaders().containsKey("stompCommand") ||
headerAccessor.getMessageHeaders().containsKey("simpMessageType");
}
private boolean isDirectChannel(MessageChannel channel) {

View File

@@ -102,13 +102,30 @@ public class ITTracingChannelInterceptor implements MessageHandler {
assertThat(currentSpan.isNoop()).isTrue();
}
@Test public void messageHeadersStillMutable() {
directChannel.send(MessageBuilder.withPayload("hi").setHeader("X-B3-Sampled", "0")
@Test public void messageHeadersStillMutableForStomp() {
directChannel.send(MessageBuilder.withPayload("hi").setHeader("stompCommand", "DISCONNECT")
.build());
assertThat(
MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class))
.isNotNull();
message = null;
directChannel.send(MessageBuilder.withPayload("hi").setHeader("simpMessageType", "sth")
.build());
assertThat(
MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class))
.isNotNull();
}
@Test public void messageHeadersImmutableForNonStomp() {
directChannel.send(MessageBuilder.withPayload("hi").setHeader("foo", "bar")
.build());
assertThat(
MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class))
.isNull();
}
@Configuration @EnableAutoConfiguration static class App {