org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl

Here are the examples of the java api class org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl taken from open source projects.

1. XmlImportExportTest#testPagedLargeMessage()

Project: activemq-artemis
File: XmlImportExportTest.java
@Test
public void testPagedLargeMessage() throws Exception {
    final String MY_ADDRESS = "myAddress";
    final String MY_QUEUE = "myQueue";
    server = createServer(true);
    AddressSettings defaultSetting = new AddressSettings().setPageSizeBytes(10 * 1024).setMaxSizeBytes(20 * 1024);
    server.getAddressSettingsRepository().addMatch("#", defaultSetting);
    server.start();
    ServerLocator locator = createInVMNonHALocator().setBlockOnNonDurableSend(// page mode and we could only guarantee that by setting it to synchronous
    true).setBlockOnDurableSend(true).setBlockOnAcknowledge(true);
    ClientSessionFactory factory = locator.createSessionFactory();
    ClientSession session = factory.createSession(false, true, true);
    session.createQueue(MY_ADDRESS, MY_QUEUE, true);
    ClientProducer producer = session.createProducer(MY_ADDRESS);
    ClientMessage message = session.createMessage(true);
    message.getBodyBuffer().writeBytes(new byte[1024]);
    for (int i = 0; i < 200; i++) {
        producer.send(message);
    }
    LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager());
    fileMessage.setMessageID(1005);
    fileMessage.setDurable(true);
    for (int i = 0; i < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; i++) {
        fileMessage.addBytes(new byte[] { getSamplebyte(i) });
    }
    fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE);
    fileMessage.releaseResources();
    producer.send(fileMessage);
    fileMessage.deleteFile();
    session.close();
    locator.close();
    server.stop();
    ByteArrayOutputStream xmlOutputStream = new ByteArrayOutputStream();
    XmlDataExporter xmlDataExporter = new XmlDataExporter();
    xmlDataExporter.process(xmlOutputStream, server.getConfiguration().getBindingsDirectory(), server.getConfiguration().getJournalDirectory(), server.getConfiguration().getPagingDirectory(), server.getConfiguration().getLargeMessagesDirectory());
    //System.out.print(new String(xmlOutputStream.toByteArray()));
    clearDataRecreateServerDirs();
    server.start();
    checkForLongs();
    locator = createInVMNonHALocator();
    factory = locator.createSessionFactory();
    session = factory.createSession(false, true, true);
    ByteArrayInputStream xmlInputStream = new ByteArrayInputStream(xmlOutputStream.toByteArray());
    XmlDataImporter xmlDataImporter = new XmlDataImporter();
    xmlDataImporter.process(xmlInputStream, session);
    ClientConsumer consumer = session.createConsumer(MY_QUEUE);
    session.start();
    for (int i = 0; i < 200; i++) {
        message = consumer.receive(CONSUMER_TIMEOUT);
        assertNotNull(message);
    }
    ClientMessage msg = consumer.receive(CONSUMER_TIMEOUT);
    assertNotNull(msg);
    assertEquals(2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE, msg.getBodySize());
    for (int i = 0; i < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; i++) {
        assertEquals(getSamplebyte(i), msg.getBodyBuffer().readByte());
    }
    session.close();
    locator.close();
    server.stop();
}

2. XmlImportExportTest#testLargeMessage()

Project: activemq-artemis
File: XmlImportExportTest.java
@Test
public void testLargeMessage() throws Exception {
    server = createServer(true);
    server.start();
    locator = createInVMNonHALocator();
    factory = createSessionFactory(locator);
    ClientSession session = factory.createSession(false, false);
    LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager());
    fileMessage.setMessageID(1005);
    fileMessage.setDurable(true);
    for (int i = 0; i < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; i++) {
        fileMessage.addBytes(new byte[] { getSamplebyte(i) });
    }
    fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE);
    fileMessage.releaseResources();
    session.createQueue("A", "A", true);
    ClientProducer prod = session.createProducer("A");
    prod.send(fileMessage);
    fileMessage.deleteFile();
    session.commit();
    session.close();
    locator.close();
    server.stop();
    ByteArrayOutputStream xmlOutputStream = new ByteArrayOutputStream();
    XmlDataExporter xmlDataExporter = new XmlDataExporter();
    xmlDataExporter.process(xmlOutputStream, server.getConfiguration().getBindingsDirectory(), server.getConfiguration().getJournalDirectory(), server.getConfiguration().getPagingDirectory(), server.getConfiguration().getLargeMessagesDirectory());
    System.out.print(new String(xmlOutputStream.toByteArray()));
    clearDataRecreateServerDirs();
    server.start();
    checkForLongs();
    locator = createInVMNonHALocator();
    factory = createSessionFactory(locator);
    session = factory.createSession(false, true, true);
    ByteArrayInputStream xmlInputStream = new ByteArrayInputStream(xmlOutputStream.toByteArray());
    XmlDataImporter xmlDataImporter = new XmlDataImporter();
    xmlDataImporter.process(xmlInputStream, session);
    session.close();
    session = factory.createSession(false, false);
    session.start();
    ClientConsumer cons = session.createConsumer("A");
    ClientMessage msg = cons.receive(CONSUMER_TIMEOUT);
    assertNotNull(msg);
    assertEquals(2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE, msg.getBodySize());
    for (int i = 0; i < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; i++) {
        assertEquals(getSamplebyte(i), msg.getBodyBuffer().readByte());
    }
    msg.acknowledge();
    session.commit();
}

3. LargeMessageTest#testSendServerMessage()

Project: activemq-artemis
File: LargeMessageTest.java
// The ClientConsumer should be able to also send ServerLargeMessages as that's done by the CoreBridge
@Test
public void testSendServerMessage() throws Exception {
    ActiveMQServer server = createServer(true, isNetty(), storeType);
    server.start();
    ClientSessionFactory sf = addSessionFactory(createSessionFactory(locator));
    ClientSession session = sf.createSession(false, false);
    LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager());
    fileMessage.setMessageID(1005);
    for (int i = 0; i < largeMessageSize; i++) {
        fileMessage.addBytes(new byte[] { ActiveMQTestBase.getSamplebyte(i) });
    }
    // The server would be doing this
    fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, largeMessageSize);
    fileMessage.releaseResources();
    session.createQueue(ADDRESS, ADDRESS, true);
    ClientProducer prod = session.createProducer(ADDRESS);
    prod.send(fileMessage);
    fileMessage.deleteFile();
    session.commit();
    session.start();
    ClientConsumer cons = session.createConsumer(ADDRESS);
    ClientMessage msg = cons.receive(5000);
    Assert.assertNotNull(msg);
    Assert.assertEquals(msg.getBodySize(), largeMessageSize);
    for (int i = 0; i < largeMessageSize; i++) {
        Assert.assertEquals(ActiveMQTestBase.getSamplebyte(i), msg.getBodyBuffer().readByte());
    }
    msg.acknowledge();
    session.commit();
}

4. StompSession#sendMessage()

Project: activemq-artemis
File: StompSession.java
@Override
public int sendMessage(MessageReference ref, ServerMessage serverMessage, final ServerConsumer consumer, int deliveryCount) {
    LargeServerMessageImpl largeMessage = null;
    ServerMessage newServerMessage = serverMessage;
    try {
        StompSubscription subscription = subscriptions.get(consumer.getID());
        StompFrame frame = null;
        if (serverMessage.isLargeMessage()) {
            newServerMessage = serverMessage.copy();
            largeMessage = (LargeServerMessageImpl) serverMessage;
            BodyEncoder encoder = largeMessage.getBodyEncoder();
            encoder.open();
            int bodySize = (int) encoder.getLargeBodySize();
            //large message doesn't have a body.
            ((ServerMessageImpl) newServerMessage).createBody(bodySize);
            encoder.encode(newServerMessage.getBodyBuffer(), bodySize);
            encoder.close();
        }
        if (serverMessage.getBooleanProperty(Message.HDR_LARGE_COMPRESSED)) {
            //decompress
            ActiveMQBuffer qbuff = newServerMessage.getBodyBuffer();
            int bytesToRead = qbuff.writerIndex() - MessageImpl.BODY_OFFSET;
            Inflater inflater = new Inflater();
            inflater.setInput(qbuff.readBytes(bytesToRead).toByteBuffer().array());
            //get the real size of large message
            long sizeBody = newServerMessage.getLongProperty(Message.HDR_LARGE_BODY_SIZE);
            byte[] data = new byte[(int) sizeBody];
            inflater.inflate(data);
            inflater.end();
            qbuff.resetReaderIndex();
            qbuff.resetWriterIndex();
            qbuff.writeBytes(data);
        }
        frame = connection.createStompMessage(newServerMessage, 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 sesison.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) {
        return 0;
    } finally {
        if (largeMessage != null) {
            largeMessage.releaseResources();
            largeMessage = null;
        }
    }
}