private void routeToAlternate(QueueEntry entry, Runnable postRouteTask, Predicate<BaseQueue> predicate) { boolean acquiredForDequeueing = entry.acquireOrSteal(() -> { LOGGER.debug("routing stolen node {} to alternate", entry); entry.routeToAlternate(null, null, predicate); if (postRouteTask != null) { postRouteTask.run(); } }); if (acquiredForDequeueing) { LOGGER.debug("routing node {} to alternate", entry); entry.routeToAlternate(null, null, predicate); if (postRouteTask != null) { postRouteTask.run(); } } }
private void deleteEntry(final QueueEntry entry, final Runnable postDequeueTask) { boolean acquiredForDequeueing = entry.acquireOrSteal(() -> { LOGGER.debug("Dequeuing stolen node {}", entry); dequeueEntry(entry); if (postDequeueTask != null) { postDequeueTask.run(); } }); if (acquiredForDequeueing) { LOGGER.debug("Dequeuing node {}", entry); dequeueEntry(entry); if (postDequeueTask != null) { postDequeueTask.run(); } } }
@Override public void dequeue(final QueueEntry messageInstance) { final ServerTransaction.Action deleteAction = new ServerTransaction.Action() { @Override public void postCommit() { messageInstance.delete(); } @Override public void onRollback() { } }; boolean acquired = messageInstance.acquireOrSteal(new Runnable() { @Override public void run() { ServerTransaction txn = new AutoCommitTransaction(store); txn.dequeue(messageInstance.getEnqueueRecord(), deleteAction); } }); if(acquired) { txn.dequeue(messageInstance.getEnqueueRecord(), deleteAction); } }
@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; }