/** * Create the new range for this partition containing messages that need to be exposed. * * @return range */ Range getPendingMessagesToExpose() { // Create a new range for the batch delivery tracker // Range range; if (minDeliverySeqNum == Long.MAX_VALUE) { range = Ranges.EMPTY; } else { range = Ranges.newRange(minDeliverySeqNum, maxDeliverySeqNum); } return range; }
/** * Get the number of {@link MessageIdentifier}s in the {@link DefaultMessageTracker}. * * @return number of {@link MessageIdentifier}s */ public long size() { long size = 0; Collection<RangeWrapper> ranges = rangeWrapperMap.values(); for (RangeWrapper wrapper : ranges) { size += wrapper.range.size(); } return size; }
/** * Get the iterator for the next wrapper in the map. * * @return RangeWrapper */ private Iterator<Long> nextRangeIterator() { if (rangeWrapperMapIterator.hasNext()) { currentWrapper = this.rangeWrapperMapIterator.next(); return currentWrapper.range.iterator(); } else { return null; } }
/** * Remove a {@link MessageIdentifier} from the {@link DefaultMessageTracker}. The {@link MessageIdentifier} is * not actually stored in the tracker but its partition identifier is used to look up the wrapper then * the messages sequence number is removed from the wrapper. * * @param messageIdentifier messages identifier * @return true if the message was removed */ public boolean remove(MessageIdentifier messageIdentifier) { long msgSeqNum = messageIdentifier.getMessageSequenceNumber(); RangeWrapper wrapper = ensureRangeWrapper(messageIdentifier); if (wrapper.range.contains(msgSeqNum)) { wrapper.range = wrapper.range.remove(messageIdentifier.getMessageSequenceNumber()); // putRangeInMap(newRange, messageIdentifier.getPartitionId()); return true; } return false; }
/** * {@inheritDoc} */ public MessageIdentifier getLast() { RangeWrapper wrapper = ensureRangeWrapper(lastPartitionId); long seqNum = wrapper.range.getTo(); return new MessageIdentifier(lastPartitionId, seqNum); }
/** * Add a {@link MessageIdentifier} to the {@link DefaultMessageTracker}. The {@link MessageIdentifier} is * not actually stored in the tracker but its partition identifier is used to look up the wrapper then * the messages sequence number is added to the wrapper. * * @param messageIdentifier messages identifier * @return true if the message was added */ public boolean add(MessageIdentifier messageIdentifier) { RangeWrapper wrapper = ensureRangeWrapper(messageIdentifier); wrapper.range = wrapper.range.add(messageIdentifier.getMessageSequenceNumber()); // Update the max sequence number for this partition to prevent // duplicates if (messageIdentifier.getMessageSequenceNumber() > wrapper.maxSequenceNumber) { wrapper.maxSequenceNumber = messageIdentifier.getMessageSequenceNumber(); } // Update the last partition of the message received by this tracker. lastPartitionId = messageIdentifier.getPartitionId(); return true; }
ticketIssuerId = sequenceGenerator.next(2).getFrom(); ticketBook = new TicketBook(ticketIssuerId);