diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java b/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java index e8709bf2a6..ede7441ec6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java @@ -184,8 +184,8 @@ public final class MessageBuilder { else { incomingSequenceDetails = new ArrayList>(incomingSequenceDetails); } - incomingSequenceDetails.add(Arrays.asList(incomingCorrelationId, headers - .get(MessageHeaders.SEQUENCE_NUMBER), headers.get(MessageHeaders.SEQUENCE_SIZE))); + incomingSequenceDetails.add(Arrays.asList(incomingCorrelationId, + headers.get(MessageHeaders.SEQUENCE_NUMBER), headers.get(MessageHeaders.SEQUENCE_SIZE))); incomingSequenceDetails = Collections.unmodifiableList(incomingSequenceDetails); } if (incomingSequenceDetails != null) { @@ -207,13 +207,18 @@ public final class MessageBuilder { setCorrelationId(sequenceDetails.get(0)); Integer sequenceNumber = (Integer) sequenceDetails.get(1); Integer sequenceSize = (Integer) sequenceDetails.get(2); - if (sequenceSize > 0) { + if (sequenceNumber != null) { setSequenceNumber(sequenceNumber); + } + if (sequenceSize != null) { setSequenceSize(sequenceSize); } if (!incomingSequenceDetails.isEmpty()) { headers.put(MessageHeaders.SEQUENCE_DETAILS, incomingSequenceDetails); } + else { + headers.remove(MessageHeaders.SEQUENCE_DETAILS); + } return this; } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java index 40b43a440e..ea54675a99 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java @@ -19,12 +19,12 @@ package org.springframework.integration.message; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; import java.util.Date; import java.util.UUID; import org.junit.Test; - import org.springframework.integration.Message; import org.springframework.integration.MessageHeaders; import org.springframework.integration.support.MessageBuilder; @@ -163,5 +163,43 @@ public class MessageBuilderTests { .build(); assertFalse(message2.getHeaders().containsKey("foo")); } + + @Test + public void testPushAndPopSequenceDetails() throws Exception { + Message message1 = MessageBuilder.withPayload(1).pushSequenceDetails("foo", 1, 2).build(); + assertFalse(message1.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message2 = MessageBuilder.fromMessage(message1).pushSequenceDetails("bar", 1, 1).build(); + assertTrue(message2.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message3 = MessageBuilder.fromMessage(message2).popSequenceDetails().build(); + assertFalse(message3.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + } + + @Test + public void testPushAndPopSequenceDetailsWhenNoCorrelationId() throws Exception { + Message message1 = MessageBuilder.withPayload(1).build(); + assertFalse(message1.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message2 = MessageBuilder.fromMessage(message1).pushSequenceDetails("bar", 1, 1).build(); + assertFalse(message2.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message3 = MessageBuilder.fromMessage(message2).popSequenceDetails().build(); + assertFalse(message3.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + } + + @Test + public void testPopSequenceDetailsWhenNotPopped() throws Exception { + Message message1 = MessageBuilder.withPayload(1).build(); + assertFalse(message1.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message2 = MessageBuilder.fromMessage(message1).popSequenceDetails().build(); + assertFalse(message2.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + } + + @Test + public void testPushAndPopSequenceDetailsWhenNoSequence() throws Exception { + Message message1 = MessageBuilder.withPayload(1).setCorrelationId("foo").build(); + assertFalse(message1.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message2 = MessageBuilder.fromMessage(message1).pushSequenceDetails("bar", 1, 1).build(); + assertTrue(message2.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + Message message3 = MessageBuilder.fromMessage(message2).popSequenceDetails().build(); + assertFalse(message3.getHeaders().containsKey(MessageHeaders.SEQUENCE_DETAILS)); + } }