Search in sources :

Example 16 with Filter

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

the class BindingsImpl method getNextBinding.

/**
 * This code has a race on the assigned value to routing names.
 * <p>
 * This is not that much of an issue because<br>
 * Say you have the same queue name bound into two servers. The routing will load balance between
 * these two servers. This will eventually send more messages to one server than the other
 * (depending if you are using multi-thread), and not lose messages.
 */
private Binding getNextBinding(final Message message, final SimpleString routingName, final List<Binding> bindings) {
    Integer ipos = routingNamePositions.get(routingName);
    int pos = ipos != null ? ipos : 0;
    int length = bindings.size();
    int startPos = pos;
    Binding theBinding = null;
    int lastLowPriorityBinding = -1;
    while (true) {
        Binding binding;
        try {
            binding = bindings.get(pos);
        } catch (IndexOutOfBoundsException e) {
            // This can occur if binding is removed while in route
            if (!bindings.isEmpty()) {
                pos = 0;
                startPos = 0;
                length = bindings.size();
                continue;
            } else {
                break;
            }
        }
        Filter filter = binding.getFilter();
        if (filter == null || filter.match(message)) {
            // unnecessary overhead)
            if (length == 1 || (binding.isConnected() && (messageLoadBalancingType.equals(MessageLoadBalancingType.STRICT) || binding.isHighAcceptPriority(message)))) {
                theBinding = binding;
                pos = incrementPos(pos, length);
                break;
            } else {
                // the localQueue should always have the priority over the secondary bindings
                if (lastLowPriorityBinding == -1 || messageLoadBalancingType.equals(MessageLoadBalancingType.ON_DEMAND) && binding instanceof LocalQueueBinding) {
                    lastLowPriorityBinding = pos;
                }
            }
        }
        pos = incrementPos(pos, length);
        if (pos == startPos) {
            // if no bindings were found, we will apply a secondary level on the routing logic
            if (lastLowPriorityBinding != -1) {
                try {
                    theBinding = bindings.get(lastLowPriorityBinding);
                } catch (IndexOutOfBoundsException e) {
                    // This can occur if binding is removed while in route
                    if (!bindings.isEmpty()) {
                        pos = 0;
                        lastLowPriorityBinding = -1;
                        continue;
                    } else {
                        break;
                    }
                }
                pos = incrementPos(lastLowPriorityBinding, length);
            }
            break;
        }
    }
    if (pos != startPos) {
        routingNamePositions.put(routingName, pos);
    }
    if (messageLoadBalancingType.equals(MessageLoadBalancingType.OFF) && theBinding instanceof RemoteQueueBinding) {
        theBinding = getNextBinding(message, routingName, bindings);
    }
    return theBinding;
}
Also used : Binding(org.apache.activemq.artemis.core.postoffice.Binding) RemoteQueueBinding(org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding) Filter(org.apache.activemq.artemis.core.filter.Filter) RemoteQueueBinding(org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding)

Example 17 with Filter

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

the class BindingsImpl method redistribute.

@Override
public boolean redistribute(final Message message, final Queue originatingQueue, final RoutingContext context) throws Exception {
    if (messageLoadBalancingType.equals(MessageLoadBalancingType.STRICT) || messageLoadBalancingType.equals(MessageLoadBalancingType.OFF)) {
        return false;
    }
    if (logger.isTraceEnabled()) {
        logger.trace("Redistributing message " + message);
    }
    SimpleString routingName = originatingQueue.getName();
    List<Binding> bindings = routingNameBindingMap.get(routingName);
    if (bindings == null) {
        // ConcurrentHashMap behaviour!
        return false;
    }
    Integer ipos = routingNamePositions.get(routingName);
    int pos = ipos != null ? ipos.intValue() : 0;
    int length = bindings.size();
    int startPos = pos;
    Binding theBinding = null;
    // TODO - combine this with similar logic in route()
    while (true) {
        Binding binding;
        try {
            binding = bindings.get(pos);
        } catch (IndexOutOfBoundsException e) {
            // This can occur if binding is removed while in route
            if (!bindings.isEmpty()) {
                pos = 0;
                startPos = 0;
                length = bindings.size();
                continue;
            } else {
                break;
            }
        }
        pos = incrementPos(pos, length);
        Filter filter = binding.getFilter();
        boolean highPrior = binding.isHighAcceptPriority(message);
        if (highPrior && binding.getBindable() != originatingQueue && (filter == null || filter.match(message))) {
            theBinding = binding;
            break;
        }
        if (pos == startPos) {
            break;
        }
    }
    routingNamePositions.put(routingName, pos);
    if (theBinding != null) {
        theBinding.route(message, context);
        return true;
    } else {
        return false;
    }
}
Also used : Binding(org.apache.activemq.artemis.core.postoffice.Binding) RemoteQueueBinding(org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding) Filter(org.apache.activemq.artemis.core.filter.Filter) SimpleString(org.apache.activemq.artemis.api.core.SimpleString)

Example 18 with Filter

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

the class QueueControlImpl method retryMessage.

@Override
public boolean retryMessage(final long messageID) throws Exception {
    checkStarted();
    clearIO();
    try {
        Filter singleMessageFilter = new Filter() {

            @Override
            public boolean match(Message message) {
                return message.getMessageID() == messageID;
            }

            @Override
            public SimpleString getFilterString() {
                return new SimpleString("custom filter for MESSAGEID= messageID");
            }
        };
        return queue.retryMessages(singleMessageFilter) > 0;
    } finally {
        blockOnIO();
    }
}
Also used : CoreMessage(org.apache.activemq.artemis.core.message.impl.CoreMessage) Message(org.apache.activemq.artemis.api.core.Message) Filter(org.apache.activemq.artemis.core.filter.Filter) SimpleString(org.apache.activemq.artemis.api.core.SimpleString)

Example 19 with Filter

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

the class QueueControlImpl method getFilter.

@Override
public String getFilter() {
    checkStarted();
    clearIO();
    try {
        Filter filter = queue.getFilter();
        return filter != null ? filter.getFilterString().toString() : null;
    } finally {
        blockOnIO();
    }
}
Also used : Filter(org.apache.activemq.artemis.core.filter.Filter)

Example 20 with Filter

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

the class QueueControlImpl method removeMessages.

@Override
public int removeMessages(final int flushLimit, final String filterStr) throws Exception {
    checkStarted();
    clearIO();
    try {
        Filter filter = FilterImpl.createFilter(filterStr);
        return queue.deleteMatchingReferences(flushLimit, filter);
    } finally {
        blockOnIO();
    }
}
Also used : Filter(org.apache.activemq.artemis.core.filter.Filter)

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