Search in sources :

Example 11 with Filter

use of org.apache.activemq.artemis.core.filter.Filter in project activemq-artemis by apache.

the class QueueImplTest method testConsumeWithFiltersAddAndRemoveConsumer.

@Test
public void testConsumeWithFiltersAddAndRemoveConsumer() throws Exception {
    QueueImpl queue = getTemporaryQueue();
    Filter filter = new FakeFilter("fruit", "orange");
    FakeConsumer consumer = new FakeConsumer(filter);
    queue.addConsumer(consumer);
    List<MessageReference> refs = new ArrayList<>();
    MessageReference ref1 = generateReference(queue, 1);
    ref1.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("banana"));
    queue.addTail(ref1);
    MessageReference ref2 = generateReference(queue, 2);
    ref2.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("orange"));
    queue.addTail(ref2);
    refs.add(ref2);
    Assert.assertEquals(2, getMessageCount(queue));
    awaitExecution();
    Assert.assertEquals(1, consumer.getReferences().size());
    Assert.assertEquals(1, queue.getDeliveringCount());
    assertRefListsIdenticalRefs(refs, consumer.getReferences());
    queue.acknowledge(ref2);
    queue.removeConsumer(consumer);
    queue.addConsumer(consumer);
    queue.deliverNow();
    refs.clear();
    consumer.clearReferences();
    MessageReference ref3 = generateReference(queue, 3);
    ref3.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("banana"));
    queue.addTail(ref3);
    MessageReference ref4 = generateReference(queue, 4);
    ref4.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("orange"));
    queue.addTail(ref4);
    refs.add(ref4);
    Assert.assertEquals(3, getMessageCount(queue));
    awaitExecution();
    Assert.assertEquals(1, consumer.getReferences().size());
    Assert.assertEquals(1, queue.getDeliveringCount());
    assertRefListsIdenticalRefs(refs, consumer.getReferences());
}
Also used : FakeConsumer(org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeConsumer) Filter(org.apache.activemq.artemis.core.filter.Filter) FakeFilter(org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeFilter) ArrayList(java.util.ArrayList) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) MessageReference(org.apache.activemq.artemis.core.server.MessageReference) QueueImpl(org.apache.activemq.artemis.core.server.impl.QueueImpl) FakeFilter(org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeFilter) Test(org.junit.Test)

Example 12 with Filter

use of org.apache.activemq.artemis.core.filter.Filter in project activemq-artemis by apache.

the class QueueImplTest method testConsumerWithFilters.

// Private ------------------------------------------------------------------------------
private void testConsumerWithFilters(final boolean direct) throws Exception {
    QueueImpl queue = getTemporaryQueue();
    Filter filter = new FakeFilter("fruit", "orange");
    FakeConsumer consumer = new FakeConsumer(filter);
    if (direct) {
        queue.addConsumer(consumer);
    }
    List<MessageReference> refs = new ArrayList<>();
    MessageReference ref1 = generateReference(queue, 1);
    ref1.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("banana"));
    queue.addTail(ref1);
    MessageReference ref2 = generateReference(queue, 2);
    ref2.getMessage().putStringProperty(new SimpleString("cheese"), new SimpleString("stilton"));
    queue.addTail(ref2);
    MessageReference ref3 = generateReference(queue, 3);
    ref3.getMessage().putStringProperty(new SimpleString("cake"), new SimpleString("sponge"));
    queue.addTail(ref3);
    MessageReference ref4 = generateReference(queue, 4);
    ref4.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("orange"));
    refs.add(ref4);
    queue.addTail(ref4);
    MessageReference ref5 = generateReference(queue, 5);
    ref5.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("apple"));
    queue.addTail(ref5);
    MessageReference ref6 = generateReference(queue, 6);
    ref6.getMessage().putStringProperty(new SimpleString("fruit"), new SimpleString("orange"));
    refs.add(ref6);
    queue.addTail(ref6);
    if (!direct) {
        queue.addConsumer(consumer);
        queue.deliverNow();
    }
    Assert.assertEquals(6, getMessageCount(queue));
    awaitExecution();
    Assert.assertEquals(2, consumer.getReferences().size());
    Assert.assertEquals(2, queue.getDeliveringCount());
    assertRefListsIdenticalRefs(refs, consumer.getReferences());
    queue.acknowledge(ref5);
    queue.acknowledge(ref6);
    queue.removeConsumer(consumer);
    consumer = new FakeConsumer();
    queue.addConsumer(consumer);
    queue.deliverNow();
    Assert.assertEquals(4, getMessageCount(queue));
    Assert.assertEquals(4, consumer.getReferences().size());
    Assert.assertEquals(4, queue.getDeliveringCount());
}
Also used : FakeConsumer(org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeConsumer) Filter(org.apache.activemq.artemis.core.filter.Filter) FakeFilter(org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeFilter) ArrayList(java.util.ArrayList) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) MessageReference(org.apache.activemq.artemis.core.server.MessageReference) QueueImpl(org.apache.activemq.artemis.core.server.impl.QueueImpl) FakeFilter(org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeFilter)

Example 13 with Filter

use of org.apache.activemq.artemis.core.filter.Filter in project activemq-artemis by apache.

the class PostOfficeJournalLoader method initQueues.

@Override
public void initQueues(Map<Long, QueueBindingInfo> queueBindingInfosMap, List<QueueBindingInfo> queueBindingInfos) throws Exception {
    int duplicateID = 0;
    for (final QueueBindingInfo queueBindingInfo : queueBindingInfos) {
        queueBindingInfosMap.put(queueBindingInfo.getId(), queueBindingInfo);
        final Filter filter = FilterImpl.createFilter(queueBindingInfo.getFilterString());
        final boolean isTopicIdentification = FilterUtils.isTopicIdentification(filter);
        if (postOffice.getBinding(queueBindingInfo.getQueueName()) != null) {
            if (isTopicIdentification) {
                final long tx = storageManager.generateID();
                storageManager.deleteQueueBinding(tx, queueBindingInfo.getId());
                storageManager.commitBindings(tx);
                continue;
            } else {
                final SimpleString newName = queueBindingInfo.getQueueName().concat("-" + (duplicateID++));
                ActiveMQServerLogger.LOGGER.queueDuplicatedRenaming(queueBindingInfo.getQueueName().toString(), newName.toString());
                queueBindingInfo.replaceQueueName(newName);
            }
        }
        final QueueConfig.Builder queueConfigBuilder;
        if (queueBindingInfo.getAddress() == null) {
            queueConfigBuilder = QueueConfig.builderWith(queueBindingInfo.getId(), queueBindingInfo.getQueueName());
        } else {
            queueConfigBuilder = QueueConfig.builderWith(queueBindingInfo.getId(), queueBindingInfo.getQueueName(), queueBindingInfo.getAddress());
        }
        queueConfigBuilder.filter(filter).pagingManager(pagingManager).user(queueBindingInfo.getUser()).durable(true).temporary(false).autoCreated(queueBindingInfo.isAutoCreated()).purgeOnNoConsumers(queueBindingInfo.isPurgeOnNoConsumers()).maxConsumers(queueBindingInfo.getMaxConsumers()).exclusive(queueBindingInfo.isExclusive()).lastValue(queueBindingInfo.isLastValue()).routingType(RoutingType.getType(queueBindingInfo.getRoutingType()));
        final Queue queue = queueFactory.createQueueWith(queueConfigBuilder.build());
        queue.setConsumersRefCount(new QueueManagerImpl(((PostOfficeImpl) postOffice).getServer(), queueBindingInfo.getQueueName()));
        if (queueBindingInfo.getQueueStatusEncodings() != null) {
            for (QueueStatusEncoding encoding : queueBindingInfo.getQueueStatusEncodings()) {
                if (encoding.getStatus() == QueueStatus.PAUSED)
                    queue.reloadPause(encoding.getId());
            }
        }
        final Binding binding = new LocalQueueBinding(queue.getAddress(), queue, nodeManager.getNodeId());
        queues.put(queue.getID(), queue);
        postOffice.addBinding(binding);
        managementService.registerQueue(queue, queue.getAddress(), storageManager);
    }
}
Also used : Binding(org.apache.activemq.artemis.core.postoffice.Binding) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) GroupBinding(org.apache.activemq.artemis.core.server.group.impl.GroupBinding) QueueConfig(org.apache.activemq.artemis.core.server.QueueConfig) QueueStatusEncoding(org.apache.activemq.artemis.core.persistence.impl.journal.codec.QueueStatusEncoding) QueueBindingInfo(org.apache.activemq.artemis.core.persistence.QueueBindingInfo) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) LocalQueueBinding(org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding) Filter(org.apache.activemq.artemis.core.filter.Filter) Queue(org.apache.activemq.artemis.core.server.Queue) PostOfficeImpl(org.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl)

Example 14 with Filter

use of org.apache.activemq.artemis.core.filter.Filter in project activemq-artemis by apache.

the class FilterTest method testAMQSize.

@Test
public void testAMQSize() throws Exception {
    message.setAddress(RandomUtil.randomSimpleString());
    int encodeSize = message.getEncodeSize();
    Filter moreThanSmall = FilterImpl.createFilter(new SimpleString("AMQSize > " + (encodeSize - 1)));
    Filter lessThanLarge = FilterImpl.createFilter(new SimpleString("AMQSize < " + (encodeSize + 1)));
    Filter lessThanSmall = FilterImpl.createFilter(new SimpleString("AMQSize < " + encodeSize));
    Filter moreThanLarge = FilterImpl.createFilter(new SimpleString("AMQSize > " + encodeSize));
    Assert.assertTrue(moreThanSmall.match(message));
    Assert.assertTrue(lessThanLarge.match(message));
    Assert.assertFalse(lessThanSmall.match(message));
    Assert.assertFalse(moreThanLarge.match(message));
}
Also used : Filter(org.apache.activemq.artemis.core.filter.Filter) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) Test(org.junit.Test)

Example 15 with Filter

use of org.apache.activemq.artemis.core.filter.Filter in project activemq-artemis by apache.

the class AbstractJournalStorageManager method internalQueueBinding.

private void internalQueueBinding(boolean update, final long tx, final Binding binding) throws Exception {
    Queue queue = (Queue) binding.getBindable();
    Filter filter = queue.getFilter();
    SimpleString filterString = filter == null ? null : filter.getFilterString();
    PersistentQueueBindingEncoding bindingEncoding = new PersistentQueueBindingEncoding(queue.getName(), binding.getAddress(), filterString, queue.getUser(), queue.isAutoCreated(), queue.getMaxConsumers(), queue.isPurgeOnNoConsumers(), queue.isExclusive(), queue.isLastValue(), queue.getRoutingType().getType());
    readLock();
    try {
        if (update) {
            bindingsJournal.appendUpdateRecordTransactional(tx, binding.getID(), JournalRecordIds.QUEUE_BINDING_RECORD, bindingEncoding);
        } else {
            bindingsJournal.appendAddRecordTransactional(tx, binding.getID(), JournalRecordIds.QUEUE_BINDING_RECORD, bindingEncoding);
        }
    } finally {
        readUnLock();
    }
}
Also used : Filter(org.apache.activemq.artemis.core.filter.Filter) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) PersistentQueueBindingEncoding(org.apache.activemq.artemis.core.persistence.impl.journal.codec.PersistentQueueBindingEncoding) Queue(org.apache.activemq.artemis.core.server.Queue)

Aggregations

Filter (org.apache.activemq.artemis.core.filter.Filter)30 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)18 Binding (org.apache.activemq.artemis.core.postoffice.Binding)9 ActiveMQException (org.apache.activemq.artemis.api.core.ActiveMQException)8 ArrayList (java.util.ArrayList)7 MessageReference (org.apache.activemq.artemis.core.server.MessageReference)7 Test (org.junit.Test)7 Queue (org.apache.activemq.artemis.core.server.Queue)6 QueueImpl (org.apache.activemq.artemis.core.server.impl.QueueImpl)6 PageSubscription (org.apache.activemq.artemis.core.paging.cursor.PageSubscription)5 QueueBinding (org.apache.activemq.artemis.core.postoffice.QueueBinding)5 LocalQueueBinding (org.apache.activemq.artemis.core.postoffice.impl.LocalQueueBinding)5 QueueConfig (org.apache.activemq.artemis.core.server.QueueConfig)5 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)4 Message (org.apache.activemq.artemis.api.core.Message)4 StorageManager (org.apache.activemq.artemis.core.persistence.StorageManager)4 PostOffice (org.apache.activemq.artemis.core.postoffice.PostOffice)4 DivertBinding (org.apache.activemq.artemis.core.postoffice.impl.DivertBinding)4 ActiveMQServer (org.apache.activemq.artemis.core.server.ActiveMQServer)4 HierarchicalRepository (org.apache.activemq.artemis.core.settings.HierarchicalRepository)4