private int readFromMapped(StorageManager storage, List<PagedMessage> messages) throws IOException { file.position(0); //use a readonly mapped view of the file final int mappedSize = size.get(); final MappedByteBuffer mappedByteBuffer = mapFileForRead(this.file.getJavaFile(), mappedSize); ChannelBufferWrapper activeMQBuffer = wrapBuffer(mappedSize, mappedByteBuffer); try { return read(storage, activeMQBuffer, messages); } finally { //unmap the file after read it to avoid GC to take care of it PlatformDependent.freeDirectBuffer(mappedByteBuffer); } }
private void readFromSequentialFile(StorageManager storage, List<PagedMessage> messages) throws Exception { final int fileSize = (int) file.size(); //doesn't need to be a direct buffer: that case is covered using the MMAP read final ByteBuffer buffer = this.fileFactory.newBuffer(fileSize); try { file.position(0); file.read(buffer); buffer.rewind(); assert (buffer.limit() == fileSize) : "buffer doesn't contains the whole file"; ChannelBufferWrapper activeMQBuffer = wrapBuffer(fileSize, buffer); read(storage, activeMQBuffer, messages); } finally { this.fileFactory.releaseBuffer(buffer); } }
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); }