Search in sources :

Example 1 with LargeServerMessageImpl

use of org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl 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 2 with LargeServerMessageImpl

use of org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl in project activemq-artemis by apache.

the class ScaleDown3NodeTest method testBasicScaleDownInternal.

private void testBasicScaleDownInternal(int reconnectAttempts, boolean large) throws Exception {
    AddressSettings addressSettings = new AddressSettings().setRedistributionDelay(0);
    servers[0].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[1].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[2].getAddressSettingsRepository().addMatch("#", addressSettings);
    servers[0].getConfiguration().getClusterConfigurations().get(0).setReconnectAttempts(reconnectAttempts);
    servers[1].getConfiguration().getClusterConfigurations().get(0).setReconnectAttempts(reconnectAttempts);
    servers[2].getConfiguration().getClusterConfigurations().get(0).setReconnectAttempts(reconnectAttempts);
    final int TEST_SIZE = 10;
    final String addressName = "testAddress";
    final String queueName1 = "testQueue1";
    // create a queue on each node mapped to the same address
    createQueue(0, addressName, queueName1, null, false, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    createQueue(1, addressName, queueName1, null, false, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    createQueue(2, addressName, queueName1, null, false, servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword());
    // pause the SnF queue so that when the server tries to redistribute a message it won't actually go across the cluster bridge
    String snfAddress = servers[0].getInternalNamingPrefix() + "sf.cluster0." + servers[0].getNodeID().toString();
    Queue snfQueue = ((LocalQueueBinding) servers[2].getPostOffice().getBinding(SimpleString.toSimpleString(snfAddress))).getQueue();
    snfQueue.pause();
    ClientSession session = sfs[2].createSession(servers[2].getConfiguration().getClusterUser(), servers[2].getConfiguration().getClusterPassword(), false, true, false, false, 0);
    Message message;
    if (large) {
        LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) servers[2].getStorageManager());
        fileMessage.setMessageID(1005);
        fileMessage.setDurable(true);
        for (int i = 0; i < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; i++) {
            fileMessage.addBytes(new byte[] { ActiveMQTestBase.getSamplebyte(i) });
        }
        fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE);
        fileMessage.releaseResources();
        message = fileMessage;
    } else {
        message = session.createMessage(false);
    }
    for (int i = 0; i < TEST_SIZE; i++) {
        ClientProducer producer = session.createProducer(addressName);
        producer.send(message);
    }
    if (large) {
        ((LargeServerMessageImpl) message).deleteFile();
    }
    // add a consumer to node 0 to trigger redistribution here
    addConsumer(0, 0, queueName1, null, true, servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword());
    // allow some time for redistribution to move the message to the SnF queue
    long timeout = 10000;
    long start = System.currentTimeMillis();
    long messageCount = 0;
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(snfQueue);
        if (messageCount < TEST_SIZE) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    // ensure the message is in the SnF queue
    Assert.assertEquals(TEST_SIZE, getMessageCount(snfQueue));
    // trigger scaleDown from node 0 to node 1
    IntegrationTestLogger.LOGGER.info("============ Stopping " + servers[0].getNodeID());
    removeConsumer(0);
    servers[0].stop();
    start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(((LocalQueueBinding) servers[2].getPostOffice().getBinding(new SimpleString(queueName1))).getQueue());
        if (messageCount > 0) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    Assert.assertEquals(0, messageCount);
    // get the messages from queue 1 on node 1
    addConsumer(0, 1, queueName1, null, true, servers[1].getConfiguration().getClusterUser(), servers[1].getConfiguration().getClusterPassword());
    // allow some time for redistribution to move the message to node 1
    start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout) {
        // ensure the message is not in the queue on node 2
        messageCount = getMessageCount(((LocalQueueBinding) servers[1].getPostOffice().getBinding(new SimpleString(queueName1))).getQueue());
        if (messageCount < TEST_SIZE) {
            Thread.sleep(200);
        } else {
            break;
        }
    }
    // ensure the message is in queue 1 on node 1 as expected
    Assert.assertEquals(TEST_SIZE, messageCount);
    for (int i = 0; i < TEST_SIZE; i++) {
        ClientMessage clientMessage = consumers[0].getConsumer().receive(250);
        Assert.assertNotNull(clientMessage);
        if (large) {
            Assert.assertEquals(2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE, clientMessage.getBodySize());
            for (int j = 0; j < 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE; j++) {
                Assert.assertEquals(ActiveMQTestBase.getSamplebyte(j), clientMessage.getBodyBuffer().readByte());
            }
        }
        IntegrationTestLogger.LOGGER.info("Received: " + clientMessage);
        clientMessage.acknowledge();
    }
    // ensure there are no more messages on queue 1
    ClientMessage clientMessage = consumers[0].getConsumer().receive(250);
    Assert.assertNull(clientMessage);
    removeConsumer(0);
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Message(org.apache.activemq.artemis.api.core.Message) LargeServerMessageImpl(org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) Queue(org.apache.activemq.artemis.core.server.Queue) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer)

Example 3 with LargeServerMessageImpl

use of org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl in project activemq-artemis by apache.

the class XmlImportExportTest method testLargeMessagesNoTmpFiles.

@Test
public void testLargeMessagesNoTmpFiles() 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", RoutingType.MULTICAST, "A", true);
    ClientProducer prod = session.createProducer("A");
    prod.send(fileMessage);
    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.sort = true;
    xmlDataImporter.validate(xmlInputStream);
    xmlInputStream.reset();
    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 = 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();
    // make sure there is not tmp file left
    File workingDir = new File(System.getProperty("user.dir"));
    String[] flist = workingDir.list();
    for (String fn : flist) {
        assertFalse("leftover: " + fn, fn.endsWith(".tmp"));
    }
}
Also used : LargeServerMessageImpl(org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl) ByteArrayOutputStream(java.io.ByteArrayOutputStream) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) XmlDataImporter(org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataImporter) ByteArrayInputStream(java.io.ByteArrayInputStream) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) File(java.io.File) XmlDataExporter(org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataExporter) Test(org.junit.Test)

Example 4 with LargeServerMessageImpl

use of org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl in project activemq-artemis by apache.

the class XmlImportExportTest method testLargeMessage.

@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", RoutingType.MULTICAST, "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.validate(xmlInputStream);
    xmlInputStream.reset();
    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();
}
Also used : LargeServerMessageImpl(org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl) ByteArrayInputStream(java.io.ByteArrayInputStream) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ByteArrayOutputStream(java.io.ByteArrayOutputStream) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) XmlDataExporter(org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataExporter) XmlDataImporter(org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataImporter) Test(org.junit.Test)

Example 5 with LargeServerMessageImpl

use of org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl in project activemq-artemis by apache.

the class LargeMessageTest method testSendServerMessage.

// 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();
}
Also used : ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) LargeServerMessageImpl(org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Test(org.junit.Test)

Aggregations

LargeServerMessageImpl (org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl)7 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)6 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)6 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)6 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)5 Test (org.junit.Test)5 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)4 ByteArrayInputStream (java.io.ByteArrayInputStream)3 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)3 XmlDataExporter (org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataExporter)3 XmlDataImporter (org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataImporter)3 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)2 ActiveMQServer (org.apache.activemq.artemis.core.server.ActiveMQServer)2 AddressSettings (org.apache.activemq.artemis.core.settings.impl.AddressSettings)2 File (java.io.File)1 ActiveMQBuffer (org.apache.activemq.artemis.api.core.ActiveMQBuffer)1 ICoreMessage (org.apache.activemq.artemis.api.core.ICoreMessage)1 Message (org.apache.activemq.artemis.api.core.Message)1 LocalQueueBinding (org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding)1