Search in sources :

Example 46 with Queue

use of org.apache.qpid.server.model.Queue in project qpid-broker-j by apache.

the class ConsumerTarget_0_10 method sendToDLQOrDiscard.

private void sendToDLQOrDiscard(final MessageInstanceConsumer consumer, MessageInstance entry) {
    final ServerMessage msg = entry.getMessage();
    int requeues = 0;
    if (entry.makeAcquisitionUnstealable(consumer)) {
        requeues = entry.routeToAlternate(new Action<MessageInstance>() {

            @Override
            public void performAction(final MessageInstance requeueEntry) {
                getEventLogger().message(ChannelMessages.DEADLETTERMSG(msg.getMessageNumber(), requeueEntry.getOwningResource().getName()));
            }
        }, null, null);
    }
    if (requeues == 0) {
        TransactionLogResource owningResource = entry.getOwningResource();
        if (owningResource instanceof Queue) {
            final Queue<?> queue = (Queue<?>) owningResource;
            final MessageDestination alternateBindingDestination = queue.getAlternateBindingDestination();
            if (alternateBindingDestination != null) {
                getEventLogger().message(ChannelMessages.DISCARDMSG_NOROUTE(msg.getMessageNumber(), alternateBindingDestination.getName()));
            } else {
                getEventLogger().message(ChannelMessages.DISCARDMSG_NOALTEXCH(msg.getMessageNumber(), queue.getName(), msg.getInitialRoutingAddress()));
            }
        }
    }
}
Also used : MessageInstance(org.apache.qpid.server.message.MessageInstance) Action(org.apache.qpid.server.util.Action) MessageDestination(org.apache.qpid.server.message.MessageDestination) ServerMessage(org.apache.qpid.server.message.ServerMessage) TransactionLogResource(org.apache.qpid.server.store.TransactionLogResource) Queue(org.apache.qpid.server.model.Queue)

Example 47 with Queue

use of org.apache.qpid.server.model.Queue in project qpid-broker-j by apache.

the class ServerSessionDelegate method exchangeBound.

@Override
public void exchangeBound(ServerSession session, ExchangeBound method) {
    ExchangeBoundResult result = new ExchangeBoundResult();
    NamedAddressSpace addressSpace = getAddressSpace(session);
    Exchange<?> exchange;
    MessageSource source;
    Queue<?> queue;
    boolean isDefaultExchange;
    if (!nameNullOrEmpty(method.getExchange())) {
        isDefaultExchange = false;
        exchange = getExchange(addressSpace, method.getExchange(), false);
        if (exchange == null) {
            result.setExchangeNotFound(true);
        }
    } else {
        isDefaultExchange = true;
        exchange = null;
    }
    if (isDefaultExchange) {
        // fake the existence of the "default" exchange for 0-10
        if (method.hasQueue()) {
            queue = getQueue(session, method.getQueue());
            if (queue == null) {
                result.setQueueNotFound(true);
            } else {
                if (method.hasBindingKey()) {
                    if (!method.getBindingKey().equals(method.getQueue())) {
                        result.setKeyNotMatched(true);
                    }
                }
            }
        } else if (method.hasBindingKey()) {
            if (getQueue(session, method.getBindingKey()) == null) {
                result.setKeyNotMatched(true);
            }
        }
        if (method.hasArguments() && !method.getArguments().isEmpty()) {
            result.setArgsNotMatched(true);
        }
    } else if (method.hasQueue()) {
        source = getMessageSource(session, method.getQueue());
        if (source == null) {
            result.setQueueNotFound(true);
        }
        if (source == null || source instanceof Queue) {
            queue = (Queue<?>) source;
            if (exchange != null && queue != null) {
                boolean queueMatched = exchange.isBound(queue);
                result.setQueueNotMatched(!queueMatched);
                if (method.hasBindingKey()) {
                    if (queueMatched) {
                        final boolean keyMatched = exchange.isBound(method.getBindingKey(), queue);
                        result.setKeyNotMatched(!keyMatched);
                        if (method.hasArguments()) {
                            if (keyMatched) {
                                result.setArgsNotMatched(!exchange.isBound(method.getBindingKey(), method.getArguments(), queue));
                            } else {
                                result.setArgsNotMatched(!exchange.isBound(method.getArguments(), queue));
                            }
                        }
                    } else {
                        boolean keyMatched = exchange.isBound(method.getBindingKey());
                        result.setKeyNotMatched(!keyMatched);
                        if (method.hasArguments()) {
                            if (keyMatched) {
                                result.setArgsNotMatched(!exchange.isBound(method.getBindingKey(), method.getArguments()));
                            } else {
                                result.setArgsNotMatched(!exchange.isBound(method.getArguments()));
                            }
                        }
                    }
                } else if (method.hasArguments()) {
                    if (queueMatched) {
                        result.setArgsNotMatched(!exchange.isBound(method.getArguments(), queue));
                    } else {
                        result.setArgsNotMatched(!exchange.isBound(method.getArguments()));
                    }
                }
            } else if (exchange != null && method.hasBindingKey()) {
                final boolean keyMatched = exchange.isBound(method.getBindingKey());
                result.setKeyNotMatched(!keyMatched);
                if (method.hasArguments()) {
                    if (keyMatched) {
                        result.setArgsNotMatched(!exchange.isBound(method.getBindingKey(), method.getArguments()));
                    } else {
                        result.setArgsNotMatched(!exchange.isBound(method.getArguments()));
                    }
                }
            }
        }
    } else if (exchange != null && method.hasBindingKey()) {
        final boolean keyMatched = exchange.isBound(method.getBindingKey());
        result.setKeyNotMatched(!keyMatched);
        if (method.hasArguments()) {
            if (keyMatched) {
                result.setArgsNotMatched(!exchange.isBound(method.getBindingKey(), method.getArguments()));
            } else {
                result.setArgsNotMatched(!exchange.isBound(method.getArguments()));
            }
        }
    } else if (exchange != null && method.hasArguments()) {
        result.setArgsNotMatched(!exchange.isBound(method.getArguments()));
    }
    session.executionResult((int) method.getId(), result);
}
Also used : NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) MessageSource(org.apache.qpid.server.message.MessageSource) Queue(org.apache.qpid.server.model.Queue)

Example 48 with Queue

use of org.apache.qpid.server.model.Queue in project qpid-broker-j by apache.

the class ServerSessionDelegate method queueDeclare.

@Override
public void queueDeclare(ServerSession session, final QueueDeclare method) {
    final NamedAddressSpace addressSpace = getAddressSpace(session);
    String queueName = method.getQueue();
    Queue<?> queue;
    // TODO: do we need to check that the queue already exists with exactly the same "configuration"?
    final boolean exclusive = method.getExclusive();
    final boolean autoDelete = method.getAutoDelete();
    if (method.getPassive()) {
        queue = getQueue(addressSpace, queueName);
        if (queue == null) {
            String description = "Queue: " + queueName + " not found on VirtualHost(" + addressSpace + ").";
            ExecutionErrorCode errorCode = ExecutionErrorCode.NOT_FOUND;
            exception(session, method, errorCode, description);
        } else if (exclusive) {
            if (queue.getExclusive() == ExclusivityPolicy.NONE) {
                String description = "Cannot passively declare queue ('" + queueName + "')" + " as exclusive as queue with same name is" + " already declared as non-exclusive";
                ExecutionErrorCode errorCode = ExecutionErrorCode.RESOURCE_LOCKED;
                exception(session, method, errorCode, description);
            } else if (!verifySessionAccess(session, queue)) {
                String description = "Cannot passively declare queue('" + queueName + "')," + " as exclusive queue with same name " + "declared on another session";
                ExecutionErrorCode errorCode = ExecutionErrorCode.RESOURCE_LOCKED;
                exception(session, method, errorCode, description);
            }
        }
    } else {
        try {
            Queue.BehaviourOnUnknownDeclareArgument unknownArgumentBehaviour = session.getAMQPConnection().getContextValue(Queue.BehaviourOnUnknownDeclareArgument.class, Queue.UNKNOWN_QUEUE_DECLARE_ARGUMENT_BEHAVIOUR_NAME);
            final Map<String, Object> arguments = QueueArgumentsConverter.convertWireArgsToModel(queueName, method.getArguments(), session.getAMQPConnection().getModel(), unknownArgumentBehaviour);
            final String alternateExchangeName = method.getAlternateExchange();
            if (method.hasAlternateExchange() && !nameNullOrEmpty(alternateExchangeName)) {
                validateAlternateExchangeIsNotQueue(addressSpace, alternateExchangeName);
                arguments.put(Queue.ALTERNATE_BINDING, Collections.singletonMap(AlternateBinding.DESTINATION, alternateExchangeName));
            }
            arguments.put(Queue.NAME, queueName);
            if (!arguments.containsKey(Queue.LIFETIME_POLICY)) {
                LifetimePolicy lifetime;
                if (autoDelete) {
                    lifetime = exclusive ? LifetimePolicy.DELETE_ON_SESSION_END : LifetimePolicy.DELETE_ON_NO_OUTBOUND_LINKS;
                } else {
                    lifetime = LifetimePolicy.PERMANENT;
                }
                arguments.put(Queue.LIFETIME_POLICY, lifetime);
            }
            if (!arguments.containsKey(Queue.EXCLUSIVE)) {
                ExclusivityPolicy exclusivityPolicy = exclusive ? ExclusivityPolicy.SESSION : ExclusivityPolicy.NONE;
                arguments.put(Queue.EXCLUSIVE, exclusivityPolicy);
            }
            arguments.put(Queue.DURABLE, method.getDurable());
            queue = addressSpace.createMessageSource(Queue.class, arguments);
        } catch (AbstractConfiguredObject.DuplicateNameException qe) {
            queue = (Queue<?>) qe.getExisting();
            if (!verifySessionAccess(session, queue)) {
                String description = "Cannot declare queue('" + queueName + "')," + " as exclusive queue with same name " + "declared on another session";
                ExecutionErrorCode errorCode = ExecutionErrorCode.RESOURCE_LOCKED;
                exception(session, method, errorCode, description);
            }
        } catch (AccessControlException e) {
            exception(session, method, ExecutionErrorCode.UNAUTHORIZED_ACCESS, e.getMessage());
        } catch (UnknownAlternateBindingException e) {
            exception(session, method, ExecutionErrorCode.NOT_FOUND, String.format("Unknown alternate destination '%s'", e.getAlternateBindingName()));
        } catch (IllegalArgumentException | IllegalConfigurationException e) {
            exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, e.getMessage());
        }
    }
}
Also used : LifetimePolicy(org.apache.qpid.server.model.LifetimePolicy) NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) IllegalConfigurationException(org.apache.qpid.server.configuration.IllegalConfigurationException) AccessControlException(java.security.AccessControlException) ExclusivityPolicy(org.apache.qpid.server.model.ExclusivityPolicy) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) UnknownAlternateBindingException(org.apache.qpid.server.virtualhost.UnknownAlternateBindingException) Queue(org.apache.qpid.server.model.Queue)

Example 49 with Queue

use of org.apache.qpid.server.model.Queue in project qpid-broker-j by apache.

the class ServerSessionDelegate method queueQuery.

@Override
public void queueQuery(ServerSession session, QueueQuery method) {
    QueueQueryResult result = new QueueQueryResult();
    MessageSource source = getMessageSource(session, method.getQueue());
    if (source != null) {
        result.setQueue(source.getName());
        if (source instanceof Queue) {
            final Queue<?> queue = (Queue<?>) source;
            result.setDurable(queue.isDurable());
            result.setExclusive(queue.isExclusive());
            result.setAutoDelete(queue.getLifetimePolicy() != LifetimePolicy.PERMANENT);
            Map<String, Object> arguments = new LinkedHashMap<>();
            Collection<String> availableAttrs = queue.getAvailableAttributes();
            for (String attrName : availableAttrs) {
                arguments.put(attrName, queue.getAttribute(attrName));
            }
            result.setArguments(QueueArgumentsConverter.convertModelArgsToWire(arguments));
            result.setMessageCount(queue.getQueueDepthMessages());
            result.setSubscriberCount(queue.getConsumerCount());
        } else {
            result.setDurable(true);
            result.setExclusive(false);
            result.setAutoDelete(false);
            result.setMessageCount(Integer.MAX_VALUE);
            result.setSubscriberCount(0);
        }
    }
    session.executionResult((int) method.getId(), result);
}
Also used : MessageSource(org.apache.qpid.server.message.MessageSource) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) Queue(org.apache.qpid.server.model.Queue) LinkedHashMap(java.util.LinkedHashMap)

Example 50 with Queue

use of org.apache.qpid.server.model.Queue in project qpid-broker-j by apache.

the class MessageConverter_Internal_to_v0_10 method getReplyTo.

private ReplyTo getReplyTo(final NamedAddressSpace addressSpace, final String origReplyTo) {
    DestinationAddress destinationAddress = new DestinationAddress(addressSpace, origReplyTo);
    MessageDestination messageDestination = destinationAddress.getMessageDestination();
    final String exchange = ensureStr8("reply-to[\"exchange\"]", messageDestination instanceof Exchange ? messageDestination.getName() : "");
    final String routingKey = ensureStr8("reply-to[\"routing-key\"]", messageDestination instanceof Queue ? messageDestination.getName() : destinationAddress.getRoutingKey());
    return new ReplyTo(exchange, routingKey);
}
Also used : Exchange(org.apache.qpid.server.model.Exchange) ReplyTo(org.apache.qpid.server.protocol.v0_10.transport.ReplyTo) MessageDestination(org.apache.qpid.server.message.MessageDestination) Queue(org.apache.qpid.server.model.Queue) DestinationAddress(org.apache.qpid.server.model.DestinationAddress)

Aggregations

Queue (org.apache.qpid.server.model.Queue)66 Test (org.junit.Test)32 HashMap (java.util.HashMap)18 Exchange (org.apache.qpid.server.model.Exchange)13 MessageDestination (org.apache.qpid.server.message.MessageDestination)11 Attach (org.apache.qpid.server.protocol.v1_0.type.transport.Attach)9 DestinationAddress (org.apache.qpid.server.model.DestinationAddress)8 MessageSource (org.apache.qpid.server.message.MessageSource)6 AbstractConfiguredObject (org.apache.qpid.server.model.AbstractConfiguredObject)6 ConfiguredObject (org.apache.qpid.server.model.ConfiguredObject)6 NamedAddressSpace (org.apache.qpid.server.model.NamedAddressSpace)6 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)6 ConcurrentLinkedQueue (java.util.concurrent.ConcurrentLinkedQueue)5 AccessControlException (java.security.AccessControlException)4 Map (java.util.Map)4 QmfAgentData (org.apache.qpid.qmf2.agent.QmfAgentData)4 ServerMessage (org.apache.qpid.server.message.ServerMessage)4 MessagePublishInfo (org.apache.qpid.server.protocol.v0_8.transport.MessagePublishInfo)4 LinkedHashMap (java.util.LinkedHashMap)3 AMQInvalidArgumentException (org.apache.qpid.server.filter.AMQInvalidArgumentException)3