INT-330: added a check for superseded messages (duplicating sequence number)

This commit is contained in:
Iwein Fuld
2009-09-30 21:11:10 +00:00
parent e7e18fbbb0
commit 7a0b2587bf
6 changed files with 320 additions and 40 deletions

View File

@@ -110,9 +110,14 @@ public class BufferingMessageHandler extends AbstractMessageHandler implements L
Object correlationKey = correlationStrategy.getCorrelationKey(message);
try {
if (tracker.aquireLockFor(correlationKey)) {
store(message, correlationKey);
List<Message<?>> all = store.getAll(correlationKey);
complete(correlationKey, all, this.resolveReplyChannel(message, this.outputChannel, this.channelResolver));
List<Message<?>> group = store.getAll(correlationKey);
if (noSupersedingMessage(message, group)) {
store(message, correlationKey);
group.add(message);
complete(correlationKey, group, this.resolveReplyChannel(message, this.outputChannel, this.channelResolver));
} else {
discardChannel.send(message);
}
} else {
discardChannel.send(message);
}
@@ -121,6 +126,15 @@ public class BufferingMessageHandler extends AbstractMessageHandler implements L
}
}
private boolean noSupersedingMessage(Message<?> message, List<Message<?>> group) {
for (Message<?> member : group) {
if (member.getHeaders().getSequenceNumber() == message.getHeaders().getSequenceNumber()) {
return false;
}
}
return true;
}
private boolean complete(Object correlationKey, List<Message<?>> correlatedMessages, MessageChannel messageChannel) {
boolean processed = false;
if (completionStrategy.isComplete(correlatedMessages)) {