diff --git a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/DefaultMessageEndpoint.java b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/DefaultMessageEndpoint.java index c0882be442..53519dbcd4 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/DefaultMessageEndpoint.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/DefaultMessageEndpoint.java @@ -261,6 +261,9 @@ public class DefaultMessageEndpoint implements MessageEndpoint, ChannelRegistryA try { Message replyMessage = this.handler.handle(message); if (replyMessage != null) { + if (replyMessage.getHeader().getCorrelationId() == null) { + replyMessage.getHeader().setCorrelationId(message.getId()); + } this.replyHandler.handle(replyMessage, message.getHeader()); } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/endpoint/DefaultMessageEndpointTests.java b/spring-integration-core/src/test/java/org/springframework/integration/endpoint/DefaultMessageEndpointTests.java index d83b32f8ec..45518e631e 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/endpoint/DefaultMessageEndpointTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/endpoint/DefaultMessageEndpointTests.java @@ -17,6 +17,7 @@ package org.springframework.integration.endpoint; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -521,6 +522,41 @@ public class DefaultMessageEndpointTests { assertEquals(message2, ((MessageDeliveryException) error).getUndeliveredMessage()); } + @Test + public void testCorrelationId() { + SimpleChannel replyChannel = new SimpleChannel(1); + DefaultMessageEndpoint endpoint = new DefaultMessageEndpoint(new MessageHandler() { + public Message handle(Message message) { + return message; + } + }); + endpoint.start(); + Message message = new StringMessage("test"); + message.getHeader().setReturnAddress(replyChannel); + endpoint.handle(message); + Message reply = replyChannel.receive(500); + assertEquals(message.getId(), reply.getHeader().getCorrelationId()); + } + + @Test + public void testCorrelationIdSetByHandlerTakesPrecedence() { + SimpleChannel replyChannel = new SimpleChannel(1); + DefaultMessageEndpoint endpoint = new DefaultMessageEndpoint(new MessageHandler() { + public Message handle(Message message) { + message.getHeader().setCorrelationId("ABC-123"); + return message; + } + }); + endpoint.start(); + Message message = new StringMessage("test"); + message.getHeader().setReturnAddress(replyChannel); + endpoint.handle(message); + Message reply = replyChannel.receive(500); + Object correlationId = reply.getHeader().getCorrelationId(); + assertFalse(message.getId().equals(correlationId)); + assertEquals("ABC-123", correlationId); + } + private static ExecutorService createExecutor() { return new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new SynchronousQueue());