diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java index 052e9ea0bf..cb4eb8bf1e 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/CorrelatingMessageHandler.java @@ -173,7 +173,7 @@ public class CorrelatingMessageHandler extends AbstractMessageHandler implements } outputProcessor.processAndSend(group, channelTemplate, this.resolveReplyChannel(message, this.outputChannel)); - if (group.isComplete()) { + if (group.isComplete() || group.getSequenceSize()==0) { complete(group); } else { diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/MessageGroup.java b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/MessageGroup.java index ebb29cc6ce..83b311c26d 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/MessageGroup.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/aggregator/MessageGroup.java @@ -92,8 +92,8 @@ public class MessageGroup { return true; } int sequenceSize = getSequenceSize(); - // If there is no sequence then it must be complete.... - return sequenceSize == 0 || sequenceSize == size(); + // If there is no sequence then it must be incomplete.... + return sequenceSize > 0 && sequenceSize == size(); } public int getSequenceSize() { diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/CorrelatingMessageHandlerIntegrationTest.java b/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/CorrelatingMessageHandlerIntegrationTest.java index d9f99f270c..73d83e5362 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/CorrelatingMessageHandlerIntegrationTest.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/aggregator/CorrelatingMessageHandlerIntegrationTest.java @@ -16,6 +16,10 @@ package org.springframework.integration.aggregator; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + import org.junit.Before; import org.junit.Test; import org.springframework.integration.core.Message; @@ -24,8 +28,6 @@ import org.springframework.integration.message.MessageBuilder; import org.springframework.integration.store.MessageStore; import org.springframework.integration.store.SimpleMessageStore; -import static org.mockito.Mockito.*; - public class CorrelatingMessageHandlerIntegrationTest { private MessageStore store = new SimpleMessageStore(100); @@ -64,6 +66,20 @@ public class CorrelatingMessageHandlerIntegrationTest { verify(discardChannel).send(message2); } + @Test + public void completesIfNoSequence() throws Exception { + defaultHandler.setReleaseStrategy(new MessageCountReleaseStrategy(2)); + Message message1 = MessageBuilder.withPayload(1).setCorrelationId("foo").build(); + Message message2 = MessageBuilder.withPayload(2).setCorrelationId("foo").build(); + Message message3 = MessageBuilder.withPayload(3).setCorrelationId("foo").build(); + defaultHandler.handleMessage(message1); + verify(outputChannel, never()).send(message3); + defaultHandler.handleMessage(message2); + verify(outputChannel).send(message2); + defaultHandler.handleMessage(message3); + verify(outputChannel, never()).send(message3); + } + @Test public void completesWithoutReleasingIncompleteCorrelations() throws Exception { Message message1 = correlatedMessage(1, 2, 1); diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorWithCorrelationStrategyTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorWithCorrelationStrategyTests.java index 10b3f0776b..50b0380ce0 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorWithCorrelationStrategyTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/AggregatorWithCorrelationStrategyTests.java @@ -63,24 +63,15 @@ public class AggregatorWithCorrelationStrategyTests { @Test public void testCorrelationAndCompletion() { - inputChannel.send(MessageBuilder.withPayload("A1").setSequenceNumber(0).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("B2").setSequenceNumber(0).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("C3").setSequenceNumber(0).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("A4").setSequenceNumber(1).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("B5").setSequenceNumber(1).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("C6").setSequenceNumber(1).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("A7").setSequenceNumber(2).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("B8").setSequenceNumber(2).setSequenceSize(3) - .build()); - inputChannel.send(MessageBuilder.withPayload("C9").setSequenceNumber(2).setSequenceSize(3) - .build()); + inputChannel.send(MessageBuilder.withPayload("A1").build()); + inputChannel.send(MessageBuilder.withPayload("B2").build()); + inputChannel.send(MessageBuilder.withPayload("C3").build()); + inputChannel.send(MessageBuilder.withPayload("A4").build()); + inputChannel.send(MessageBuilder.withPayload("B5").build()); + inputChannel.send(MessageBuilder.withPayload("C6").build()); + inputChannel.send(MessageBuilder.withPayload("A7").build()); + inputChannel.send(MessageBuilder.withPayload("B8").build()); + inputChannel.send(MessageBuilder.withPayload("C9").build()); receiveAndCompare(outputChannel, "A1", "A4", "A7"); receiveAndCompare(outputChannel, "B2", "B5", "B8"); receiveAndCompare(outputChannel, "C3", "C6", "C9"); @@ -91,34 +82,25 @@ public class AggregatorWithCorrelationStrategyTests { // the test verifies how a pojo strategy is applied // Strings are correlated by their first letter, integers are correlated // by the last digit - pojoInputChannel.send(MessageBuilder.withPayload("X1") - .setSequenceNumber(0).setSequenceSize(3).build()); - pojoInputChannel.send(MessageBuilder.withPayload(93).setSequenceNumber( - 0).setSequenceSize(3).build()); - pojoInputChannel.send(MessageBuilder.withPayload("X4") - .setSequenceNumber(1).setSequenceSize(3).build()); - pojoInputChannel.send(MessageBuilder.withPayload(113) - .setSequenceNumber(1).setSequenceSize(3).build()); - pojoInputChannel.send(MessageBuilder.withPayload("X7") - .setSequenceNumber(2).setSequenceSize(3).build()); - pojoInputChannel.send(MessageBuilder.withPayload(213) - .setSequenceNumber(2).setSequenceSize(3).build()); + pojoInputChannel.send(MessageBuilder.withPayload("X1").build()); + pojoInputChannel.send(MessageBuilder.withPayload(93).build()); + pojoInputChannel.send(MessageBuilder.withPayload("X4").build()); + pojoInputChannel.send(MessageBuilder.withPayload(113).build()); + pojoInputChannel.send(MessageBuilder.withPayload("X7").build()); + pojoInputChannel.send(MessageBuilder.withPayload(213).build()); receiveAndCompare(pojoOutputChannel, "X1", "X4", "X7"); receiveAndCompare(pojoOutputChannel, "93", "113", "213"); } - private void receiveAndCompare(PollableChannel outputChannel, - String... expectedValues) { + private void receiveAndCompare(PollableChannel outputChannel, String... expectedValues) { Message message = outputChannel.receive(500); Assert.assertNotNull(message); for (String expectedValue : expectedValues) { - assertThat((String) message.getPayload(), - containsString(expectedValue)); + assertThat((String) message.getPayload(), containsString(expectedValue)); } } - public static class MessageCountReleaseStrategy implements - ReleaseStrategy { + public static class MessageCountReleaseStrategy implements ReleaseStrategy { private final int expectedSize; @@ -132,8 +114,7 @@ public class AggregatorWithCorrelationStrategyTests { } - public static class FirstLetterCorrelationStrategy implements - CorrelationStrategy { + public static class FirstLetterCorrelationStrategy implements CorrelationStrategy { public Object getCorrelationKey(Message message) { return message.getPayload().toString().subSequence(0, 1);