Search in sources :

Example 21 with ActiveMQBuffer

use of org.apache.activemq.artemis.api.core.ActiveMQBuffer in project activemq-artemis by apache.

the class StompSession method sendMessage.

@Override
public int sendMessage(MessageReference ref, Message serverMessage, final ServerConsumer consumer, int deliveryCount) {
    ICoreMessage coreMessage = serverMessage.toCore();
    LargeServerMessageImpl largeMessage = null;
    ICoreMessage newServerMessage = serverMessage.toCore();
    try {
        StompSubscription subscription = subscriptions.get(consumer.getID());
        // subscription might be null if the consumer was closed
        if (subscription == null)
            return 0;
        StompFrame frame;
        ActiveMQBuffer buffer = coreMessage.getDataBuffer();
        frame = connection.createStompMessage(newServerMessage, buffer, subscription, deliveryCount);
        int length = frame.getEncodedSize();
        if (subscription.getAck().equals(Stomp.Headers.Subscribe.AckModeValues.AUTO)) {
            if (manager.send(connection, frame)) {
                final long messageID = newServerMessage.getMessageID();
                final long consumerID = consumer.getID();
                // this will be called after the delivery is complete
                // we can't call session.ack within the delivery
                // as it could dead lock.
                afterDeliveryTasks.offer(new PendingTask() {

                    @Override
                    public void run() throws Exception {
                        // we ack and commit only if the send is successful
                        session.acknowledge(consumerID, messageID);
                        session.commit();
                    }
                });
            }
        } else {
            messagesToAck.put(newServerMessage.getMessageID(), new Pair<>(consumer.getID(), length));
            // Must send AFTER adding to messagesToAck - or could get acked from client BEFORE it's been added!
            manager.send(connection, frame);
        }
        return length;
    } catch (Exception e) {
        if (ActiveMQStompProtocolLogger.LOGGER.isDebugEnabled()) {
            ActiveMQStompProtocolLogger.LOGGER.debug(e);
        }
        return 0;
    } finally {
        if (largeMessage != null) {
            largeMessage.releaseResources();
            largeMessage = null;
        }
    }
}
Also used : ICoreMessage(org.apache.activemq.artemis.api.core.ICoreMessage) LargeServerMessageImpl(org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl) PendingTask(org.apache.activemq.artemis.utils.PendingTask) ActiveMQBuffer(org.apache.activemq.artemis.api.core.ActiveMQBuffer)

Example 22 with ActiveMQBuffer

use of org.apache.activemq.artemis.api.core.ActiveMQBuffer in project activemq-artemis by apache.

the class XmlDataExporter method printLargeMessageBody.

private void printLargeMessageBody(LargeServerMessage message) throws XMLStreamException {
    xmlWriter.writeAttribute(XmlDataConstants.MESSAGE_IS_LARGE, Boolean.TRUE.toString());
    LargeBodyEncoder encoder = null;
    try {
        encoder = message.toCore().getBodyEncoder();
        encoder.open();
        long totalBytesWritten = 0;
        Long bufferSize;
        long bodySize = encoder.getLargeBodySize();
        for (long i = 0; i < bodySize; i += LARGE_MESSAGE_CHUNK_SIZE) {
            Long remainder = bodySize - totalBytesWritten;
            if (remainder >= LARGE_MESSAGE_CHUNK_SIZE) {
                bufferSize = LARGE_MESSAGE_CHUNK_SIZE;
            } else {
                bufferSize = remainder;
            }
            ActiveMQBuffer buffer = ActiveMQBuffers.fixedBuffer(bufferSize.intValue());
            encoder.encode(buffer, bufferSize.intValue());
            xmlWriter.writeCData(XmlDataExporterUtil.encode(buffer.toByteBuffer().array()));
            totalBytesWritten += bufferSize;
        }
        encoder.close();
    } catch (ActiveMQException e) {
        e.printStackTrace();
    } finally {
        if (encoder != null) {
            try {
                encoder.close();
            } catch (ActiveMQException e) {
                e.printStackTrace();
            }
        }
    }
}
Also used : ActiveMQException(org.apache.activemq.artemis.api.core.ActiveMQException) LargeBodyEncoder(org.apache.activemq.artemis.core.message.LargeBodyEncoder) ActiveMQBuffer(org.apache.activemq.artemis.api.core.ActiveMQBuffer)

Example 23 with ActiveMQBuffer

use of org.apache.activemq.artemis.api.core.ActiveMQBuffer in project activemq-artemis by apache.

the class ChannelBufferWrapper method readSlice.

@Override
public ActiveMQBuffer readSlice(final int length) {
    if (isPooled) {
        ByteBuf fromBuffer = buffer.readSlice(length);
        ByteBuf newNettyBuffer = Unpooled.buffer(fromBuffer.capacity());
        int read = fromBuffer.readerIndex();
        int writ = fromBuffer.writerIndex();
        fromBuffer.readerIndex(0);
        fromBuffer.readBytes(newNettyBuffer, 0, writ);
        newNettyBuffer.setIndex(read, writ);
        ActiveMQBuffer returnBuffer = new ChannelBufferWrapper(newNettyBuffer, releasable, false);
        returnBuffer.setIndex(read, writ);
        return returnBuffer;
    }
    return new ChannelBufferWrapper(buffer.readSlice(length), releasable, isPooled);
}
Also used : ByteBuf(io.netty.buffer.ByteBuf) ActiveMQBuffer(org.apache.activemq.artemis.api.core.ActiveMQBuffer)

Example 24 with ActiveMQBuffer

use of org.apache.activemq.artemis.api.core.ActiveMQBuffer in project activemq-artemis by apache.

the class JournalImpl method initFileHeader.

/**
 * @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();
    }
}
Also used : ByteBuffer(java.nio.ByteBuffer) ActiveMQBuffer(org.apache.activemq.artemis.api.core.ActiveMQBuffer)

Example 25 with ActiveMQBuffer

use of org.apache.activemq.artemis.api.core.ActiveMQBuffer in project activemq-artemis by apache.

the class SequentialFileTptBenchmark method main.

public static void main(String[] args) throws Exception {
    final boolean dataSync = false;
    final boolean writeSync = true;
    final Type type = Type.Mapped;
    final int tests = 10;
    final int warmup = 20_000;
    final int measurements = 100_000;
    final int msgSize = 100;
    final byte[] msgContent = new byte[msgSize];
    Arrays.fill(msgContent, (byte) 1);
    final File tmpDirectory = new File("./");
    // using the default configuration when the broker starts!
    final SequentialFileFactory factory;
    switch(type) {
        case Mapped:
            final int fileSize = Math.max(msgSize * measurements, msgSize * warmup);
            factory = new MappedSequentialFileFactory(tmpDirectory, fileSize, true, ArtemisConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, ArtemisConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO, null).setDatasync(dataSync);
            break;
        case Nio:
            factory = new NIOSequentialFileFactory(tmpDirectory, true, ArtemisConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO, ArtemisConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO, 1, false, null, null).setDatasync(dataSync);
            break;
        case Aio:
            factory = new AIOSequentialFileFactory(tmpDirectory, ArtemisConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, ArtemisConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO, 500, false, null, null).setDatasync(dataSync);
            // disable it when using directly the same buffer: ((AIOSequentialFileFactory)factory).disableBufferReuse();
            if (!LibaioContext.isLoaded()) {
                throw new IllegalStateException("lib AIO not loaded!");
            }
            break;
        default:
            throw new AssertionError("unsupported case");
    }
    factory.start();
    try {
        final EncodingSupport encodingSupport = new EncodingSupport() {

            @Override
            public int getEncodeSize() {
                return msgSize;
            }

            @Override
            public void encode(ActiveMQBuffer buffer) {
                final int writerIndex = buffer.writerIndex();
                buffer.setBytes(writerIndex, msgContent);
                buffer.writerIndex(writerIndex + msgSize);
            }

            @Override
            public void decode(ActiveMQBuffer buffer) {
            }
        };
        final int alignedMessageSize = factory.calculateBlockSize(msgSize);
        final long totalFileSize = Math.max(alignedMessageSize * measurements, alignedMessageSize * warmup);
        if (totalFileSize > Integer.MAX_VALUE)
            throw new IllegalArgumentException("reduce measurements/warmup");
        final int fileSize = (int) totalFileSize;
        final SequentialFile sequentialFile = factory.createSequentialFile("seq.dat");
        sequentialFile.getJavaFile().delete();
        sequentialFile.getJavaFile().deleteOnExit();
        sequentialFile.open();
        final long startZeros = System.nanoTime();
        sequentialFile.fill(fileSize);
        final long elapsedZeros = System.nanoTime() - startZeros;
        System.out.println("Zeroed " + fileSize + " bytes in " + TimeUnit.NANOSECONDS.toMicros(elapsedZeros) + " us");
        try {
            {
                final long elapsed = writeMeasurements(factory, sequentialFile, encodingSupport, warmup, writeSync);
                System.out.println("warmup:" + (measurements * 1000_000_000L) / elapsed + " ops/sec");
            }
            for (int t = 0; t < tests; t++) {
                final long elapsed = writeMeasurements(factory, sequentialFile, encodingSupport, measurements, writeSync);
                System.out.println((measurements * 1000_000_000L) / elapsed + " ops/sec");
            }
        } finally {
            sequentialFile.close();
        }
    } finally {
        factory.stop();
    }
}
Also used : MappedSequentialFileFactory(org.apache.activemq.artemis.core.io.mapped.MappedSequentialFileFactory) AIOSequentialFileFactory(org.apache.activemq.artemis.core.io.aio.AIOSequentialFileFactory) NIOSequentialFileFactory(org.apache.activemq.artemis.core.io.nio.NIOSequentialFileFactory) MappedSequentialFileFactory(org.apache.activemq.artemis.core.io.mapped.MappedSequentialFileFactory) AIOSequentialFileFactory(org.apache.activemq.artemis.core.io.aio.AIOSequentialFileFactory) ActiveMQExceptionType(org.apache.activemq.artemis.api.core.ActiveMQExceptionType) File(java.io.File) NIOSequentialFileFactory(org.apache.activemq.artemis.core.io.nio.NIOSequentialFileFactory) EncodingSupport(org.apache.activemq.artemis.core.journal.EncodingSupport) ActiveMQBuffer(org.apache.activemq.artemis.api.core.ActiveMQBuffer)

Aggregations

ActiveMQBuffer (org.apache.activemq.artemis.api.core.ActiveMQBuffer)150 Test (org.junit.Test)81 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)49 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)44 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)39 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)38 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)35 ByteBuffer (java.nio.ByteBuffer)34 Configuration (org.apache.activemq.artemis.core.config.Configuration)34 StoreConfiguration (org.apache.activemq.artemis.core.config.StoreConfiguration)27 DivertConfiguration (org.apache.activemq.artemis.core.config.DivertConfiguration)25 DatabaseStorageConfiguration (org.apache.activemq.artemis.core.config.storage.DatabaseStorageConfiguration)25 ArrayList (java.util.ArrayList)21 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)21 Queue (org.apache.activemq.artemis.core.server.Queue)18 HashMap (java.util.HashMap)17 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)16 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)15 RecordInfo (org.apache.activemq.artemis.core.journal.RecordInfo)15 CoreMessage (org.apache.activemq.artemis.core.message.impl.CoreMessage)14