protected synchronized void flushToDisk() { if (!memoryList.isEmpty() && store != null) { long start = 0; if (LOG.isTraceEnabled()) { start = System.currentTimeMillis(); LOG.trace( "{}, flushToDisk() mem list size: {} {}", new Object[] { name, memoryList.size(), (systemUsage != null ? systemUsage.getMemoryUsage() : "") }); } for (Iterator<MessageReference> iterator = memoryList.iterator(); iterator.hasNext(); ) { MessageReference node = iterator.next(); node.decrementReferenceCount(); ByteSequence bs; try { bs = getByteSequence(node.getMessage()); getDiskList().addLast(node.getMessageId().toString(), bs); } catch (IOException e) { LOG.error("Failed to write to disk list", e); throw new RuntimeException(e); } } memoryList.clear(); setCacheEnabled(false); LOG.trace( "{}, flushToDisk() done - {} ms {}", new Object[] { name, (System.currentTimeMillis() - start), (systemUsage != null ? systemUsage.getMemoryUsage() : "") }); } }
@Override public synchronized void destroy() throws Exception { stop(); for (Iterator<MessageReference> i = memoryList.iterator(); i.hasNext(); ) { MessageReference node = i.next(); node.decrementReferenceCount(); } memoryList.clear(); destroyDiskList(); }
protected synchronized void expireOldMessages() { if (!memoryList.isEmpty()) { for (Iterator<MessageReference> iterator = memoryList.iterator(); iterator.hasNext(); ) { MessageReference node = iterator.next(); if (node.isExpired()) { node.decrementReferenceCount(); discardExpiredMessage(node); iterator.remove(); } } } }
/** @return true if there are no pending messages */ @Override public synchronized boolean isEmpty() { if (memoryList.isEmpty() && isDiskListEmpty()) { return true; } for (Iterator<MessageReference> iterator = memoryList.iterator(); iterator.hasNext(); ) { MessageReference node = iterator.next(); if (node == QueueMessageReference.NULL_MESSAGE) { continue; } if (!node.isDropped()) { return false; } // We can remove dropped references. iterator.remove(); } return isDiskListEmpty(); }
@Override public synchronized boolean tryAddMessageLast(MessageReference node, long maxWaitTime) throws Exception { if (!node.isExpired()) { try { regionDestination = (Destination) node.getMessage().getRegionDestination(); if (isDiskListEmpty()) { if (hasSpace() || this.store == null) { memoryList.addMessageLast(node); node.incrementReferenceCount(); setCacheEnabled(true); return true; } } if (!hasSpace()) { if (isDiskListEmpty()) { expireOldMessages(); if (hasSpace()) { memoryList.addMessageLast(node); node.incrementReferenceCount(); return true; } else { flushToDisk(); } } } if (systemUsage.getTempUsage().waitForSpace(maxWaitTime)) { ByteSequence bs = getByteSequence(node.getMessage()); getDiskList().addLast(node.getMessageId().toString(), bs); return true; } return false; } catch (Exception e) { LOG.error( "Caught an Exception adding a message: {} first to FilePendingMessageCursor ", node, e); throw new RuntimeException(e); } } else { discardExpiredMessage(node); } // message expired return true; }
/** clear all pending messages */ @Override public synchronized void clear() { memoryList.clear(); if (!isDiskListEmpty()) { try { getDiskList().destroy(); } catch (IOException e) { throw new RuntimeException(e); } } last = null; }
/** * add message to await dispatch * * @param node */ @Override public synchronized void addMessageFirst(MessageReference node) { if (!node.isExpired()) { try { regionDestination = (Destination) node.getMessage().getRegionDestination(); if (isDiskListEmpty()) { if (hasSpace()) { memoryList.addMessageFirst(node); node.incrementReferenceCount(); setCacheEnabled(true); return; } } if (!hasSpace()) { if (isDiskListEmpty()) { expireOldMessages(); if (hasSpace()) { memoryList.addMessageFirst(node); node.incrementReferenceCount(); return; } else { flushToDisk(); } } } systemUsage.getTempUsage().waitForSpace(); node.decrementReferenceCount(); ByteSequence bs = getByteSequence(node.getMessage()); Object locator = getDiskList().addFirst(node.getMessageId().toString(), bs); node.getMessageId().setPlistLocator(locator); } catch (Exception e) { LOG.error( "Caught an Exception adding a message: {} first to FilePendingMessageCursor ", node, e); throw new RuntimeException(e); } } else { discardExpiredMessage(node); } }
/** * @param node * @see * org.apache.activemq.broker.region.cursors.AbstractPendingMessageCursor#remove(org.apache.activemq.broker.region.MessageReference) */ @Override public synchronized void remove(MessageReference node) { if (memoryList.remove(node) != null) { node.decrementReferenceCount(); } if (!isDiskListEmpty()) { try { getDiskList().remove(node.getMessageId().getPlistLocator()); } catch (IOException e) { throw new RuntimeException(e); } } }
@Override public synchronized LinkedList<MessageReference> pageInList(int maxItems) { LinkedList<MessageReference> result = new LinkedList<MessageReference>(); int count = 0; for (Iterator<MessageReference> i = memoryList.iterator(); i.hasNext() && count < maxItems; ) { MessageReference ref = i.next(); ref.incrementReferenceCount(); result.add(ref); count++; } if (count < maxItems && !isDiskListEmpty()) { for (Iterator<MessageReference> i = new DiskIterator(); i.hasNext() && count < maxItems; ) { Message message = (Message) i.next(); message.setRegionDestination(regionDestination); message.setMemoryUsage(this.getSystemUsage().getMemoryUsage()); message.incrementReferenceCount(); result.add(message); count++; } } return result; }
/** @return the number of pending messages */ @Override public synchronized int size() { return memoryList.size() + (isDiskListEmpty() ? 0 : (int) getDiskList().size()); }