Search in sources :

Example 41 with AddressSettings

use of org.apache.activemq.artemis.core.settings.impl.AddressSettings in project activemq-artemis by apache.

the class MessageExpirationTest method testMessageExpiredWithExpiryAddress.

@Test
public void testMessageExpiredWithExpiryAddress() throws Exception {
    SimpleString address = RandomUtil.randomSimpleString();
    SimpleString queue = RandomUtil.randomSimpleString();
    final SimpleString expiryAddress = RandomUtil.randomSimpleString();
    SimpleString expiryQueue = RandomUtil.randomSimpleString();
    server.getAddressSettingsRepository().addMatch(address.toString(), new AddressSettings() {

        private static final long serialVersionUID = -6476053400596299130L;

        @Override
        public SimpleString getExpiryAddress() {
            return expiryAddress;
        }
    });
    session.createQueue(address, queue, false);
    session.createQueue(expiryAddress, expiryQueue, false);
    ClientProducer producer = session.createProducer(address);
    ClientMessage message = session.createMessage(false);
    message.setExpiration(System.currentTimeMillis() + MessageExpirationTest.EXPIRATION);
    producer.send(message);
    Thread.sleep(MessageExpirationTest.EXPIRATION * 2);
    session.start();
    ClientConsumer consumer = session.createConsumer(queue);
    ClientMessage message2 = consumer.receiveImmediate();
    Assert.assertNull(message2);
    ClientConsumer expiryConsumer = session.createConsumer(expiryQueue);
    ClientMessage expiredMessage = expiryConsumer.receive(500);
    Assert.assertNotNull(expiredMessage);
    Assert.assertNotNull(expiredMessage.getObjectProperty(Message.HDR_ACTUAL_EXPIRY_TIME));
    Assert.assertEquals(address, expiredMessage.getObjectProperty(Message.HDR_ORIGINAL_ADDRESS));
    Assert.assertEquals(queue, expiredMessage.getObjectProperty(Message.HDR_ORIGINAL_QUEUE));
    consumer.close();
    expiryConsumer.close();
    session.deleteQueue(queue);
    session.deleteQueue(expiryQueue);
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) 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) Test(org.junit.Test)

Example 42 with AddressSettings

use of org.apache.activemq.artemis.core.settings.impl.AddressSettings in project activemq-artemis by apache.

the class ProducerFlowControlTest method testFlowControlMessageNotRouted.

@Test
public void testFlowControlMessageNotRouted() throws Exception {
    final SimpleString address = new SimpleString("testaddress");
    server = createServer(false, isNetty());
    AddressSettings addressSettings = new AddressSettings().setMaxSizeBytes(1024).setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK);
    HierarchicalRepository<AddressSettings> repos = server.getAddressSettingsRepository();
    repos.addMatch(address.toString(), addressSettings);
    server.start();
    waitForServerToStart(server);
    locator.setProducerWindowSize(1024).setConsumerWindowSize(1024).setAckBatchSize(1024);
    sf = createSessionFactory(locator);
    session = sf.createSession(false, true, true, true);
    ClientProducer producer = session.createProducer(address);
    byte[] bytes = new byte[100];
    final int numMessages = 1000;
    for (int i = 0; i < numMessages; i++) {
        ClientMessage message = session.createMessage(false);
        message.getBodyBuffer().writeBytes(bytes);
        producer.send(message);
    }
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Test(org.junit.Test)

Example 43 with AddressSettings

use of org.apache.activemq.artemis.core.settings.impl.AddressSettings in project activemq-artemis by apache.

the class ProducerFlowControlTest method testFlowControl.

private void testFlowControl(final int numMessages, final int messageSize, final int maxSize, final int producerWindowSize, final int consumerWindowSize, final int ackBatchSize, final int numConsumers, final int numProducers, final long consumerDelay, final boolean anon, final int minLargeMessageSize, final boolean realFiles) throws Exception {
    final SimpleString address = new SimpleString("testaddress");
    server = createServer(realFiles, isNetty());
    AddressSettings addressSettings = new AddressSettings().setMaxSizeBytes(maxSize).setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK);
    HierarchicalRepository<AddressSettings> repos = server.getAddressSettingsRepository();
    repos.addMatch(address.toString(), addressSettings);
    server.start();
    waitForServerToStart(server);
    locator.setProducerWindowSize(producerWindowSize).setConsumerWindowSize(consumerWindowSize).setAckBatchSize(ackBatchSize);
    if (minLargeMessageSize != -1) {
        locator.setMinLargeMessageSize(minLargeMessageSize);
    }
    sf = createSessionFactory(locator);
    session = sf.createSession(false, true, true, true);
    session.start();
    final String queueName = "testqueue";
    for (int i = 0; i < numConsumers; i++) {
        session.createQueue(address, new SimpleString(queueName + i), null, false);
    }
    final byte[] bytes = RandomUtil.randomBytes(messageSize);
    class MyHandler implements MessageHandler {

        int count = 0;

        final CountDownLatch latch = new CountDownLatch(1);

        volatile Exception exception;

        @Override
        public void onMessage(final ClientMessage message) {
            try {
                byte[] bytesRead = new byte[messageSize];
                message.getBodyBuffer().readBytes(bytesRead);
                ActiveMQTestBase.assertEqualsByteArrays(bytes, bytesRead);
                message.acknowledge();
                if (++count == numMessages * numProducers) {
                    latch.countDown();
                }
                if (consumerDelay > 0) {
                    Thread.sleep(consumerDelay);
                }
            } catch (Exception e) {
                ProducerFlowControlTest.log.error("Failed to handle message", e);
                exception = e;
                latch.countDown();
            }
        }
    }
    MyHandler[] handlers = new MyHandler[numConsumers];
    for (int i = 0; i < numConsumers; i++) {
        handlers[i] = new MyHandler();
        ClientConsumer consumer = session.createConsumer(new SimpleString(queueName + i));
        consumer.setMessageHandler(handlers[i]);
    }
    ClientProducer[] producers = new ClientProducer[numProducers];
    for (int i = 0; i < numProducers; i++) {
        if (anon) {
            producers[i] = session.createProducer();
        } else {
            producers[i] = session.createProducer(address);
        }
    }
    long start = System.currentTimeMillis();
    for (int i = 0; i < numMessages; i++) {
        ClientMessage message = session.createMessage(false);
        message.getBodyBuffer().writeBytes(bytes);
        for (int j = 0; j < numProducers; j++) {
            if (anon) {
                producers[j].send(address, message);
            } else {
                producers[j].send(message);
            }
        }
    }
    for (int i = 0; i < numConsumers; i++) {
        Assert.assertTrue(handlers[i].latch.await(5, TimeUnit.MINUTES));
        Assert.assertNull(handlers[i].exception);
    }
    long end = System.currentTimeMillis();
    double rate = 1000 * (double) numMessages / (end - start);
    ProducerFlowControlTest.log.info("rate is " + rate + " msgs / sec");
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) MessageHandler(org.apache.activemq.artemis.api.core.client.MessageHandler) 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) CountDownLatch(java.util.concurrent.CountDownLatch) ActiveMQObjectClosedException(org.apache.activemq.artemis.api.core.ActiveMQObjectClosedException) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer)

Example 44 with AddressSettings

use of org.apache.activemq.artemis.core.settings.impl.AddressSettings in project activemq-artemis by apache.

the class ProducerFlowControlTest method testClosingSessionUnblocksBlockedProducer.

@Test
public void testClosingSessionUnblocksBlockedProducer() throws Exception {
    final SimpleString address = new SimpleString("testaddress");
    server = createServer(false, isNetty());
    AddressSettings addressSettings = new AddressSettings().setMaxSizeBytes(1024).setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK);
    HierarchicalRepository<AddressSettings> repos = server.getAddressSettingsRepository();
    repos.addMatch(address.toString(), addressSettings);
    server.start();
    waitForServerToStart(server);
    locator.setProducerWindowSize(1024).setConsumerWindowSize(1024).setAckBatchSize(1024);
    sf = createSessionFactory(locator);
    session = sf.createSession(false, true, true, true);
    final SimpleString queueName = new SimpleString("testqueue");
    session.createQueue(address, queueName, null, false);
    ClientProducer producer = session.createProducer(address);
    byte[] bytes = new byte[2000];
    ClientMessage message = session.createMessage(false);
    message.getBodyBuffer().writeBytes(bytes);
    final AtomicBoolean closed = new AtomicBoolean(false);
    Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                Thread.sleep(500);
                closed.set(true);
                session.close();
            } catch (Exception e) {
            }
        }
    });
    t.start();
    try {
        // This will block
        for (int i = 0; i < 10; i++) {
            producer.send(message);
        }
    } catch (ActiveMQObjectClosedException expected) {
    }
    Assert.assertTrue(closed.get());
    t.join();
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ActiveMQObjectClosedException(org.apache.activemq.artemis.api.core.ActiveMQObjectClosedException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) ActiveMQObjectClosedException(org.apache.activemq.artemis.api.core.ActiveMQObjectClosedException) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Test(org.junit.Test)

Example 45 with AddressSettings

use of org.apache.activemq.artemis.core.settings.impl.AddressSettings in project activemq-artemis by apache.

the class ArtemisBrokerWrapper method translatePolicyMap.

private void translatePolicyMap(Configuration serverConfig, PolicyMap policyMap) {
    List allEntries = policyMap.getAllEntries();
    Map<String, AddressSettings> settingsMap = serverConfig.getAddressesSettings();
    for (Object o : allEntries) {
        PolicyEntry entry = (PolicyEntry) o;
        org.apache.activemq.command.ActiveMQDestination targetDest = entry.getDestination();
        String match = getCorePattern(targetDest);
        AddressSettings settings = settingsMap.get(match);
        if (settings == null) {
            settings = new AddressSettings();
            settingsMap.put(match, settings);
        }
        if (entry.isAdvisoryForSlowConsumers()) {
            settings.setSlowConsumerThreshold(1000);
            settings.setSlowConsumerCheckPeriod(1);
            settings.setSlowConsumerPolicy(SlowConsumerPolicy.NOTIFY);
        }
        if (entry.isProducerFlowControl()) {
            settings.setMaxSizeBytes(10240000).setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK);
            if (bservice.getSystemUsage().isSendFailIfNoSpace()) {
                settings.setAddressFullMessagePolicy(AddressFullMessagePolicy.FAIL);
            }
        }
        int queuePrefetch = entry.getQueuePrefetch();
        settings.setQueuePrefetch(queuePrefetch);
    }
    PolicyEntry defaultEntry = policyMap.getDefaultEntry();
    if (defaultEntry != null) {
        AddressSettings defSettings = settingsMap.get("#");
        if (defSettings == null) {
            defSettings = new AddressSettings();
            settingsMap.put("#", defSettings);
        }
        if (defaultEntry.isProducerFlowControl()) {
            defSettings.setMaxSizeBytes(10240000).setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK);
            if (bservice.getSystemUsage().isSendFailIfNoSpace()) {
                defSettings.setAddressFullMessagePolicy(AddressFullMessagePolicy.FAIL);
            }
        }
    }
}
Also used : AddressSettings(org.apache.activemq.artemis.core.settings.impl.AddressSettings) List(java.util.List) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) PolicyEntry(org.apache.activemq.broker.region.policy.PolicyEntry) ActiveMQDestination(org.apache.activemq.command.ActiveMQDestination)

Aggregations

AddressSettings (org.apache.activemq.artemis.core.settings.impl.AddressSettings)273 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)162 Test (org.junit.Test)161 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)103 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)103 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)88 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)81 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)65 ActiveMQServer (org.apache.activemq.artemis.core.server.ActiveMQServer)54 Configuration (org.apache.activemq.artemis.core.config.Configuration)52 HashMap (java.util.HashMap)31 ServerLocator (org.apache.activemq.artemis.api.core.client.ServerLocator)30 Queue (org.apache.activemq.artemis.core.server.Queue)24 TransportConfiguration (org.apache.activemq.artemis.api.core.TransportConfiguration)21 Before (org.junit.Before)19 Session (javax.jms.Session)18 Message (org.apache.activemq.artemis.api.core.Message)18 ArrayList (java.util.ArrayList)15 PagingStore (org.apache.activemq.artemis.core.paging.PagingStore)15 ActiveMQBuffer (org.apache.activemq.artemis.api.core.ActiveMQBuffer)14