public boolean isComplete(List<Message<?>> messages) { if (CollectionUtils.isEmpty(messages)) { return false; } return messages.size() != 0 && (messages.size() >= messages.get(0).getHeaders().getSequenceSize()); }
private boolean hasReceivedAllMessages(MessageBarrier<SortedSet<Message<?>>> barrier) { if(barrier.getMessages().isEmpty()) { return false; } int sequenceSize = barrier.getMessages().first().getHeaders().getSequenceSize(); int messagesCurrentlyInBarrier = barrier.getMessages().size(); Integer lastReleasedSequenceNumber = barrier.getAttribute(LAST_RELEASED_SEQUENCE_NUMBER); return (lastReleasedSequenceNumber + messagesCurrentlyInBarrier == sequenceSize); }
@Override protected boolean canAddMessage(Message<?> message, MessageBarrier<SortedSet<Message<?>>> barrier) { if (!super.canAddMessage(message, barrier)) { return false; } Integer lastReleasedSequenceNumber = barrier.getAttribute(LAST_RELEASED_SEQUENCE_NUMBER); if (barrier.messages.contains(message) || lastReleasedSequenceNumber >= message.getHeaders().getSequenceNumber()) { logger.debug("A message with the same sequence number has been already received: " + message); return false; } if (message.getHeaders().getSequenceSize() < message.getHeaders().getSequenceNumber()) { logger.debug("The message has a sequence number which is larger than the sequence size: "+ message); return false; } if (!barrier.getMessages().isEmpty() && ! message.getHeaders().getSequenceSize().equals(barrier.getMessages().first().getHeaders().getSequenceSize())) { logger.debug("The message has a sequence size which is different from other messages handled so far: " + message + ", expected value is " + barrier.getMessages().first().getHeaders().getSequenceNumber()); return false; } return true; }
@Override protected void processBarrier(MessageBarrier<SortedSet<Message<?>>> barrier) { if (hasReceivedAllMessages(barrier)) { barrier.setComplete(); } List<Message<?>> releasedMessages = releaseAvailableMessages(barrier); if (!CollectionUtils.isEmpty(releasedMessages)) { Message<?> lastMessage = releasedMessages.get(releasedMessages.size()-1); if (lastMessage.getHeaders().getSequenceNumber().equals(lastMessage.getHeaders().getSequenceSize())) { this.removeBarrier(barrier.getCorrelationKey()); } this.sendReplies(releasedMessages, this.resolveReplyChannelFromMessage(releasedMessages.get(0))); } }