@Override public void writeDirect(ByteBuffer bytes, boolean sync) throws Exception { this.sequentialFile.writeDirect(bytes, sync); }
@Override public void writeDirect(ByteBuffer bytes, boolean sync, IOCallback callback) { this.sequentialFile.writeDirect(bytes, sync, callback); }
@Override public void writeDirect(ByteBuffer bytes, boolean sync) throws Exception { this.sequentialFile.writeDirect(bytes, sync); }
@Override public void writeDirect(ByteBuffer bytes, boolean sync, IOCallback callback) { this.sequentialFile.writeDirect(bytes, sync, callback); }
@Override public void flushBuffer(final ByteBuffer buffer, final boolean requestedSync, final List<IOCallback> callbacks) { buffer.flip(); if (buffer.limit() == 0) { try { invokeDoneOn(callbacks); } finally { factory.releaseBuffer(buffer); } } else { if (callbacks.isEmpty()) { try { sequentialFile.writeDirect(buffer, requestedSync); } catch (Exception e) { throw new IllegalStateException(e); } } else { delegateCallback.delegates = callbacks; try { sequentialFile.writeDirect(buffer, requestedSync, delegateCallback); } finally { delegateCallback.delegates = null; } } } }
@Override public void flushBuffer(final ByteBuffer buffer, final boolean requestedSync, final List<IOCallback> callbacks) { buffer.flip(); if (buffer.limit() == 0) { try { invokeDoneOn(callbacks); } finally { factory.releaseBuffer(buffer); } } else { if (callbacks.isEmpty()) { try { sequentialFile.writeDirect(buffer, requestedSync); } catch (Exception e) { throw new IllegalStateException(e); } } else { delegateCallback.delegates = callbacks; try { sequentialFile.writeDirect(buffer, requestedSync, delegateCallback); } finally { delegateCallback.delegates = null; } } } }
/** * @param fileID * @param sequentialFile * @throws Exception */ public static int initFileHeader(final SequentialFileFactory fileFactory, final SequentialFile sequentialFile, final int userVersion, final long fileID) throws Exception { // We don't need to release buffers while writing. ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(bb); try { JournalImpl.writeHeader(buffer, userVersion, fileID); bb.rewind(); int bufferSize = bb.limit(); sequentialFile.position(0); sequentialFile.writeDirect(bb, true); return bufferSize; } finally { // release it by first unwrap the unreleasable buffer and then release it. buffer.byteBuf().unwrap().release(); } }
/** * @param fileID * @param sequentialFile * @throws Exception */ public static int initFileHeader(final SequentialFileFactory fileFactory, final SequentialFile sequentialFile, final int userVersion, final long fileID) throws Exception { // We don't need to release buffers while writing. ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(bb); try { JournalImpl.writeHeader(buffer, userVersion, fileID); bb.rewind(); int bufferSize = bb.limit(); sequentialFile.position(0); sequentialFile.writeDirect(bb, true); return bufferSize; } finally { // release it by first unwrap the unreleasable buffer and then release it. buffer.byteBuf().unwrap().release(); } }
@Override public void run() { try { SequentialFile file = factory.createSequentialFile("file.txt"); file.open(); ByteBuffer buffer = ByteBuffer.allocate(10); buffer.put(new byte[10]); Thread.currentThread().interrupt(); file.writeDirect(buffer, true); file.close(); } catch (Exception e) { e.printStackTrace(); } } };
@Override public void run() { try { SequentialFile file = factory.createSequentialFile("file.txt"); file.open(); ByteBuffer buffer = ByteBuffer.allocate(10); buffer.put(new byte[10]); Thread.currentThread().interrupt(); file.writeDirect(buffer, true); file.close(); } catch (Exception e) { e.printStackTrace(); } } };
@Override public final void addBytesToLargeMessage(final SequentialFile file, final long messageId, final byte[] bytes) throws Exception { readLock(); try { file.position(file.size()); file.writeDirect(ByteBuffer.wrap(bytes), false); if (isReplicated()) { replicator.largeMessageWrite(messageId, bytes); } } finally { readUnLock(); } }
@Test public void testBasicAlignment() throws Exception { FakeSequentialFileFactory factory = new FakeSequentialFileFactory(200, true); SequentialFile file = factory.createSequentialFile("test1"); file.open(); try { ByteBuffer buffer = ByteBuffer.allocateDirect(200); for (int i = 0; i < 200; i++) { buffer.put(i, (byte) 1); } file.writeDirect(buffer, true); buffer = ByteBuffer.allocate(400); for (int i = 0; i < 400; i++) { buffer.put(i, (byte) 2); } file.writeDirect(buffer, true); buffer = ByteBuffer.allocate(600); file.position(0); file.read(buffer); for (int i = 0; i < 200; i++) { Assert.assertEquals((byte) 1, buffer.get(i)); } for (int i = 201; i < 600; i++) { Assert.assertEquals("Position " + i, (byte) 2, buffer.get(i)); } } catch (Exception ignored) { } }
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); }
file.writeDirect(buffer, true);
file.writeDirect(buffer, true);
file.writeDirect(buffer, true);
file.writeDirect(buffer, true);
public final void addBytesToLargeMessage(final SequentialFile file, final long messageId, final ActiveMQBuffer bytes) throws Exception { readLock(); try { file.position(file.size()); if (bytes.byteBuf() != null && bytes.byteBuf().nioBufferCount() == 1) { final ByteBuffer nioBytes = bytes.byteBuf().internalNioBuffer(bytes.readerIndex(), bytes.readableBytes()); file.writeDirect(nioBytes, false); if (isReplicated()) { //copy defensively bytes final byte[] bytesCopy = new byte[bytes.readableBytes()]; bytes.getBytes(bytes.readerIndex(), bytesCopy); replicator.largeMessageWrite(messageId, bytesCopy); } } else { final byte[] bytesCopy = new byte[bytes.readableBytes()]; bytes.readBytes(bytesCopy); addBytesToLargeMessage(file, messageId, bytesCopy); } } finally { readUnLock(); } }
file.writeDirect(buffer, true);
file.writeDirect(buffer, sync);