PriorityQueueEntryListIterator() { for(int i = 0; i < _priorityLists.length; i++) { _iterators[i] = _priorityLists[i].iterator(); } _lastNode = (PriorityQueueEntry) _iterators[_iterators.length - 1].getNode(); }
@Override public boolean advance() { for(int i = _iterators.length-1; i >= 0; i--) { if(_iterators[i].advance()) { _lastNode = (PriorityQueueEntry) _iterators[i].getNode(); return true; } } return false; } }
@Override public List<QueueEntry> getMessagesOnTheQueue() { ArrayList<QueueEntry> entryList = new ArrayList<QueueEntry>(); QueueEntryIterator queueListIterator = getEntries().iterator(); while (queueListIterator.advance()) { QueueEntry node = queueListIterator.getNode(); if (node != null && !node.isDeleted()) { entryList.add(node); } } return entryList; }
List<QueueEntry> getMessagesOnTheQueue(QueueEntryFilter filter) { ArrayList<QueueEntry> entryList = new ArrayList<QueueEntry>(); QueueEntryIterator queueListIterator = getEntries().iterator(); while (queueListIterator.advance() && !filter.filterComplete()) { QueueEntry node = queueListIterator.getNode(); MessageReference reference = node.newMessageReference(); if (reference != null) { try { if (!node.isDeleted() && filter.accept(node)) { entryList.add(node); } } finally { reference.release(); } } } return entryList; }
final QueueEntry node = queueListIterator.getNode();
@Override public QueueEntry getOldestEntry() { QueueEntry oldestEntry = null; QueueEntryIterator iter = iterator(); while (iter.advance()) { QueueEntry node = iter.getNode(); if (node != null && !node.isDeleted()) { ServerMessage msg = node.getMessage(); if(msg != null && (oldestEntry == null || oldestEntry.getMessage().getMessageNumber() > msg.getMessageNumber())) { oldestEntry = node; } } } return oldestEntry; }
while (!_stopped.get() && queueListIterator.advance()) final QueueEntry node = queueListIterator.getNode(); if (!node.isDeleted())
@Override public void visit(final QueueEntryVisitor visitor) { QueueEntryIterator queueListIterator = getEntries().iterator(); while(queueListIterator.advance()) { QueueEntry node = queueListIterator.getNode(); MessageReference reference = node.newMessageReference(); if(reference != null) { try { final boolean done = !node.isDeleted() && visitor.visit(node); if(done) { break; } } finally { reference.release(); } } } }
@Override public void reallocateMessages() { QueueEntryIterator queueListIterator = getEntries().iterator(); while (!_stopped.get() && queueListIterator.advance()) { final QueueEntry node = queueListIterator.getNode(); if (!node.isDeleted() && !node.expired()) { try { final ServerMessage message = node.getMessage(); final MessageReference messageReference = message.newReference(); try { message.getStoredMessage().reallocate(); } finally { messageReference.release(); } } catch (MessageDeletedException mde) { // Ignore } } } }
private void flowTailToDiskIfNecessary(final long maximumQueueDepthBytes, final long maximumQueueDepthMessages) { final long queueDepthBytes = _queue.getQueueDepthBytes(); final long queueDepthMessages = _queue.getQueueDepthMessages(); if ((maximumQueueDepthBytes >= 0L && queueDepthBytes > maximumQueueDepthBytes) || (maximumQueueDepthMessages >= 0L && queueDepthMessages > maximumQueueDepthMessages)) { long cumulativeDepthBytes = 0; long cumulativeDepthMessages = 0; QueueEntryIterator queueEntryIterator = _queue.queueEntryIterator(); while (queueEntryIterator.advance()) { QueueEntry node = queueEntryIterator.getNode(); if (node != null && !node.isDeleted()) { ServerMessage message = node.getMessage(); if (message != null) { cumulativeDepthMessages++; cumulativeDepthBytes += message.getSizeIncludingHeader(); if (cumulativeDepthBytes > maximumQueueDepthBytes || cumulativeDepthMessages > maximumQueueDepthMessages) { flowToDisk(message); } } } } } }
@Override public long clearQueue() { QueueEntryIterator queueListIterator = getEntries().iterator(); long count = 0; ServerTransaction txn = new LocalTransaction(getVirtualHost().getMessageStore()); while (queueListIterator.advance()) { final QueueEntry node = queueListIterator.getNode(); boolean acquired = node.acquireOrSteal(new Runnable() { @Override public void run() { dequeueEntry(node); } }); if (acquired) { dequeueEntry(node, txn); } } txn.commit(); return count; }