/** * sendEvent means it's a close happening from a major event such moveNext. * While reading the cache we don't need (and shouldn't inform the backup */ public synchronized void close(boolean sendEvent) throws Exception { if (sendEvent && storageManager != null) { storageManager.pageClosed(storeName, pageId); } if (pageCache != null) { pageCache.close(); // leave it to the soft cache to decide when to release it now pageCache = null; } file.close(); Set<PageSubscriptionCounter> counters = getPendingCounters(); if (counters != null) { for (PageSubscriptionCounter counter : counters) { counter.cleanupNonTXCounters(this.getPageId()); } } }
pageCache.addLiveMessage(msg); if (msg.getMessage().isLargeMessage()) {
public synchronized void write(final PagedMessage message) throws Exception { if (!file.isOpen()) { throw ActiveMQMessageBundle.BUNDLE.cannotWriteToClosedFile(file); } final int messageEncodedSize = message.getEncodeSize(); final int bufferSize = messageEncodedSize + Page.SIZE_RECORD; final ByteBuffer buffer = fileFactory.newBuffer(bufferSize); ChannelBufferWrapper activeMQBuffer = wrapBuffer(bufferSize, buffer); activeMQBuffer.clear(); activeMQBuffer.writeByte(Page.START_BYTE); activeMQBuffer.writeInt(messageEncodedSize); message.encode(activeMQBuffer); activeMQBuffer.writeByte(Page.END_BYTE); assert (activeMQBuffer.readableBytes() == bufferSize) : "messageEncodedSize is different from expected"; //buffer limit and position are the same assert (buffer.remaining() == bufferSize) : "buffer position or limit are changed"; file.writeDirect(buffer, false); if (pageCache != null) { pageCache.addLiveMessage(message); } //lighter than addAndGet when single writer numberOfMessages.lazySet(numberOfMessages.get() + 1); size.lazySet(size.get() + bufferSize); storageManager.pageWrite(message, pageId); }