Search in sources :

Example 11 with Queue

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

the class PropertyConverter_1_0_to_0_10Test method testReplyToConversionWhenQueueIsSpecified.

public void testReplyToConversionWhenQueueIsSpecified() throws IOException {
    final String replyTo = "myTestQueue";
    final Queue queue = mock(Queue.class);
    when(queue.getName()).thenReturn(replyTo);
    when(_namedAddressSpace.getAttainedMessageDestination(replyTo)).thenReturn(queue);
    Properties properties = new Properties();
    properties.setReplyTo(replyTo);
    Message_1_0 message = createTestMessage(properties);
    MessageTransferMessage convertedMessage = _messageConverter.convert(message, _namedAddressSpace);
    final ReplyTo convertedReplyTo = convertedMessage.getHeader().getMessageProperties().getReplyTo();
    assertEquals("Unexpected exchange", "", convertedReplyTo.getExchange());
    assertEquals("Unexpected routing key", replyTo, convertedReplyTo.getRoutingKey());
}
Also used : ReplyTo(org.apache.qpid.server.protocol.v0_10.transport.ReplyTo) MessageTransferMessage(org.apache.qpid.server.protocol.v0_10.MessageTransferMessage) Message_1_0(org.apache.qpid.server.protocol.v1_0.Message_1_0) Matchers.anyString(org.mockito.Matchers.anyString) ApplicationProperties(org.apache.qpid.server.protocol.v1_0.type.messaging.ApplicationProperties) Properties(org.apache.qpid.server.protocol.v1_0.type.messaging.Properties) DeliveryProperties(org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties) MessageProperties(org.apache.qpid.server.protocol.v0_10.transport.MessageProperties) Queue(org.apache.qpid.server.model.Queue)

Example 12 with Queue

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

the class SynchronousMessageStoreRecoverer method recover.

@Override
public ListenableFuture<Void> recover(QueueManagingVirtualHost<?> virtualHost) {
    EventLogger eventLogger = virtualHost.getEventLogger();
    MessageStore store = virtualHost.getMessageStore();
    MessageStore.MessageStoreReader storeReader = store.newMessageStoreReader();
    MessageStoreLogSubject logSubject = new MessageStoreLogSubject(virtualHost.getName(), store.getClass().getSimpleName());
    Map<Queue<?>, Integer> queueRecoveries = new TreeMap<>();
    Map<Long, ServerMessage<?>> recoveredMessages = new HashMap<>();
    Map<Long, StoredMessage<?>> unusedMessages = new TreeMap<>();
    Map<UUID, Integer> unknownQueuesWithMessages = new HashMap<>();
    Map<Queue<?>, Integer> queuesWithUnknownMessages = new HashMap<>();
    eventLogger.message(logSubject, MessageStoreMessages.RECOVERY_START());
    storeReader.visitMessages(new MessageVisitor(recoveredMessages, unusedMessages));
    eventLogger.message(logSubject, TransactionLogMessages.RECOVERY_START(null, false));
    try {
        storeReader.visitMessageInstances(new MessageInstanceVisitor(virtualHost, store, queueRecoveries, recoveredMessages, unusedMessages, unknownQueuesWithMessages, queuesWithUnknownMessages));
    } finally {
        if (!unknownQueuesWithMessages.isEmpty()) {
            unknownQueuesWithMessages.forEach((queueId, count) -> {
                LOGGER.info("Discarded {} entry(s) associated with queue id '{}' as a queue with this " + "id does not appear in the configuration.", count, queueId);
            });
        }
        if (!queuesWithUnknownMessages.isEmpty()) {
            queuesWithUnknownMessages.forEach((queue, count) -> {
                LOGGER.info("Discarded {} entry(s) associated with queue '{}' as the referenced message " + "does not exist.", count, queue.getName());
            });
        }
    }
    for (Map.Entry<Queue<?>, Integer> entry : queueRecoveries.entrySet()) {
        Queue<?> queue = entry.getKey();
        Integer deliveredCount = entry.getValue();
        eventLogger.message(logSubject, TransactionLogMessages.RECOVERED(deliveredCount, queue.getName()));
        eventLogger.message(logSubject, TransactionLogMessages.RECOVERY_COMPLETE(queue.getName(), true));
        queue.completeRecovery();
    }
    for (Queue<?> q : virtualHost.getChildren(Queue.class)) {
        if (!queueRecoveries.containsKey(q)) {
            q.completeRecovery();
        }
    }
    storeReader.visitDistributedTransactions(new DistributedTransactionVisitor(virtualHost, eventLogger, logSubject, recoveredMessages, unusedMessages));
    for (StoredMessage<?> m : unusedMessages.values()) {
        LOGGER.debug("Message id '{}' is orphaned, removing", m.getMessageNumber());
        m.remove();
    }
    if (unusedMessages.size() > 0) {
        LOGGER.info("Discarded {} orphaned message(s).", unusedMessages.size());
    }
    eventLogger.message(logSubject, TransactionLogMessages.RECOVERY_COMPLETE(null, false));
    eventLogger.message(logSubject, MessageStoreMessages.RECOVERED(recoveredMessages.size() - unusedMessages.size()));
    eventLogger.message(logSubject, MessageStoreMessages.RECOVERY_COMPLETE());
    return Futures.immediateFuture(null);
}
Also used : MessageStore(org.apache.qpid.server.store.MessageStore) EventLogger(org.apache.qpid.server.logging.EventLogger) HashMap(java.util.HashMap) ServerMessage(org.apache.qpid.server.message.ServerMessage) TreeMap(java.util.TreeMap) StoredMessage(org.apache.qpid.server.store.StoredMessage) MessageStoreLogSubject(org.apache.qpid.server.logging.subjects.MessageStoreLogSubject) UUID(java.util.UUID) Queue(org.apache.qpid.server.model.Queue) HashMap(java.util.HashMap) Map(java.util.Map) TreeMap(java.util.TreeMap)

Example 13 with Queue

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

the class DirectExchangeTest method testDeleteOfExchangeSetAsAlternate.

public void testDeleteOfExchangeSetAsAlternate() throws Exception {
    Map<String, Object> attributes = new HashMap<>();
    attributes.put(Queue.NAME, getTestName());
    attributes.put(Queue.DURABLE, false);
    attributes.put(Queue.ALTERNATE_BINDING, Collections.singletonMap(AlternateBinding.DESTINATION, _exchange.getName()));
    Queue queue = _vhost.createChild(Queue.class, attributes);
    queue.open();
    assertEquals("Unexpected alternate exchange on queue", _exchange, queue.getAlternateBindingDestination());
    try {
        _exchange.delete();
        fail("Exchange deletion should fail with MessageDestinationIsAlternateException");
    } catch (MessageDestinationIsAlternateException e) {
    // pass
    }
    assertEquals("Unexpected effective exchange state", State.ACTIVE, _exchange.getState());
    assertEquals("Unexpected desired exchange state", State.ACTIVE, _exchange.getDesiredState());
}
Also used : HashMap(java.util.HashMap) MessageDestinationIsAlternateException(org.apache.qpid.server.virtualhost.MessageDestinationIsAlternateException) Queue(org.apache.qpid.server.model.Queue)

Example 14 with Queue

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

the class AMQChannel method receiveExchangeBound.

@Override
public void receiveExchangeBound(final AMQShortString exchangeName, final AMQShortString routingKey, final AMQShortString queueName) {
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("RECV[" + _channelId + "] ExchangeBound[" + " exchange: " + exchangeName + " routingKey: " + routingKey + " queue: " + queueName + " ]");
    }
    NamedAddressSpace virtualHost = _connection.getAddressSpace();
    MethodRegistry methodRegistry = _connection.getMethodRegistry();
    sync();
    int replyCode;
    String replyText;
    if (isDefaultExchange(exchangeName)) {
        if (routingKey == null) {
            if (queueName == null) {
                replyCode = virtualHost.hasMessageSources() ? ExchangeBoundOkBody.OK : ExchangeBoundOkBody.NO_BINDINGS;
                replyText = null;
            } else {
                MessageSource queue = virtualHost.getAttainedMessageSource(queueName.toString());
                if (queue == null) {
                    replyCode = ExchangeBoundOkBody.QUEUE_NOT_FOUND;
                    replyText = "Queue '" + queueName + "' not found";
                } else {
                    replyCode = ExchangeBoundOkBody.OK;
                    replyText = null;
                }
            }
        } else {
            if (queueName == null) {
                replyCode = virtualHost.getAttainedMessageDestination(routingKey.toString()) instanceof Queue ? ExchangeBoundOkBody.OK : ExchangeBoundOkBody.NO_QUEUE_BOUND_WITH_RK;
                replyText = null;
            } else {
                MessageDestination destination = virtualHost.getAttainedMessageDestination(queueName.toString());
                Queue<?> queue = destination instanceof Queue ? (Queue) destination : null;
                if (queue == null) {
                    replyCode = ExchangeBoundOkBody.QUEUE_NOT_FOUND;
                    replyText = "Queue '" + queueName + "' not found";
                } else {
                    replyCode = queueName.equals(routingKey) ? ExchangeBoundOkBody.OK : ExchangeBoundOkBody.SPECIFIC_QUEUE_NOT_BOUND_WITH_RK;
                    replyText = null;
                }
            }
        }
    } else {
        Exchange<?> exchange = getExchange(exchangeName.toString());
        if (exchange == null) {
            replyCode = ExchangeBoundOkBody.EXCHANGE_NOT_FOUND;
            replyText = "Exchange '" + exchangeName + "' not found";
        } else if (routingKey == null) {
            if (queueName == null) {
                if (exchange.hasBindings()) {
                    replyCode = ExchangeBoundOkBody.OK;
                    replyText = null;
                } else {
                    replyCode = ExchangeBoundOkBody.NO_BINDINGS;
                    replyText = null;
                }
            } else {
                Queue<?> queue = getQueue(queueName.toString());
                if (queue == null) {
                    replyCode = ExchangeBoundOkBody.QUEUE_NOT_FOUND;
                    replyText = "Queue '" + queueName + "' not found";
                } else {
                    if (exchange.isBound(queue)) {
                        replyCode = ExchangeBoundOkBody.OK;
                        replyText = null;
                    } else {
                        replyCode = ExchangeBoundOkBody.QUEUE_NOT_BOUND;
                        replyText = "Queue '" + queueName + "' not bound to exchange '" + exchangeName + "'";
                    }
                }
            }
        } else if (queueName != null) {
            Queue<?> queue = getQueue(queueName.toString());
            if (queue == null) {
                replyCode = ExchangeBoundOkBody.QUEUE_NOT_FOUND;
                replyText = "Queue '" + queueName + "' not found";
            } else {
                String bindingKey = routingKey == null ? null : routingKey.toString();
                if (exchange.isBound(bindingKey, queue)) {
                    replyCode = ExchangeBoundOkBody.OK;
                    replyText = null;
                } else {
                    replyCode = ExchangeBoundOkBody.SPECIFIC_QUEUE_NOT_BOUND_WITH_RK;
                    replyText = "Queue '" + queueName + "' not bound with routing key '" + routingKey + "' to exchange '" + exchangeName + "'";
                }
            }
        } else {
            if (exchange.isBound(routingKey == null ? "" : routingKey.toString())) {
                replyCode = ExchangeBoundOkBody.OK;
                replyText = null;
            } else {
                replyCode = ExchangeBoundOkBody.NO_QUEUE_BOUND_WITH_RK;
                replyText = "No queue bound with routing key '" + routingKey + "' to exchange '" + exchangeName + "'";
            }
        }
    }
    ExchangeBoundOkBody exchangeBoundOkBody = methodRegistry.createExchangeBoundOkBody(replyCode, AMQShortString.validValueOf(replyText));
    _connection.writeFrame(exchangeBoundOkBody.generateFrame(getChannelId()));
}
Also used : MessageDestination(org.apache.qpid.server.message.MessageDestination) NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) MessageSource(org.apache.qpid.server.message.MessageSource) ConcurrentLinkedQueue(java.util.concurrent.ConcurrentLinkedQueue) Queue(org.apache.qpid.server.model.Queue)

Example 15 with Queue

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

the class AMQChannel method receiveBasicConsume.

@Override
public void receiveBasicConsume(final AMQShortString queue, final AMQShortString consumerTag, final boolean noLocal, final boolean noAck, final boolean exclusive, final boolean nowait, final FieldTable arguments) {
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("RECV[" + _channelId + "] BasicConsume[" + " queue: " + queue + " consumerTag: " + consumerTag + " noLocal: " + noLocal + " noAck: " + noAck + " exclusive: " + exclusive + " nowait: " + nowait + " arguments: " + arguments + " ]");
    }
    AMQShortString consumerTag1 = consumerTag;
    NamedAddressSpace vHost = _connection.getAddressSpace();
    sync();
    String queueName = AMQShortString.toString(queue);
    MessageSource queue1 = queueName == null ? getDefaultQueue() : vHost.getAttainedMessageSource(queueName);
    final Collection<MessageSource> sources = new HashSet<>();
    if (arguments != null && arguments.get("x-multiqueue") instanceof Collection) {
        for (Object object : (Collection<Object>) arguments.get("x-multiqueue")) {
            String sourceName = String.valueOf(object);
            sourceName = sourceName.trim();
            if (sourceName.length() != 0) {
                MessageSource source = vHost.getAttainedMessageSource(sourceName);
                if (source == null) {
                    sources.clear();
                    break;
                } else {
                    sources.add(source);
                }
            }
        }
        queueName = arguments.get("x-multiqueue").toString();
    } else if (queue1 != null) {
        sources.add(queue1);
    }
    if (sources.isEmpty()) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("No queue for '" + queueName + "'");
        }
        if (queueName != null) {
            closeChannel(ErrorCodes.NOT_FOUND, "No such queue, '" + queueName + "'");
        } else {
            _connection.sendConnectionClose(ErrorCodes.NOT_ALLOWED, "No queue name provided, no default queue defined.", _channelId);
        }
    } else {
        try {
            consumerTag1 = consumeFromSource(consumerTag1, sources, !noAck, arguments, exclusive, noLocal);
            if (!nowait) {
                MethodRegistry methodRegistry = _connection.getMethodRegistry();
                AMQMethodBody responseBody = methodRegistry.createBasicConsumeOkBody(consumerTag1);
                _connection.writeFrame(responseBody.generateFrame(_channelId));
            }
        } catch (ConsumerTagInUseException cte) {
            _connection.sendConnectionClose(ErrorCodes.NOT_ALLOWED, "Non-unique consumer tag, '" + consumerTag1 + "'", _channelId);
        } catch (AMQInvalidArgumentException ise) {
            _connection.sendConnectionClose(ErrorCodes.ARGUMENT_INVALID, ise.getMessage(), _channelId);
        } catch (Queue.ExistingExclusiveConsumer e) {
            _connection.sendConnectionClose(ErrorCodes.ACCESS_REFUSED, "Cannot subscribe to queue '" + queue1.getName() + "' as it already has an existing exclusive consumer", _channelId);
        } catch (Queue.ExistingConsumerPreventsExclusive e) {
            _connection.sendConnectionClose(ErrorCodes.ACCESS_REFUSED, "Cannot subscribe to queue '" + queue1.getName() + "' exclusively as it already has a consumer", _channelId);
        } catch (AccessControlException e) {
            _connection.sendConnectionClose(ErrorCodes.ACCESS_REFUSED, "Cannot subscribe to queue '" + queue1.getName() + "' permission denied", _channelId);
        } catch (MessageSource.ConsumerAccessRefused consumerAccessRefused) {
            _connection.sendConnectionClose(ErrorCodes.ACCESS_REFUSED, "Cannot subscribe to queue '" + queue1.getName() + "' as it already has an incompatible exclusivity policy", _channelId);
        } catch (MessageSource.QueueDeleted queueDeleted) {
            _connection.sendConnectionClose(ErrorCodes.NOT_FOUND, "Cannot subscribe to queue '" + queue1.getName() + "' as it has been deleted", _channelId);
        }
    }
}
Also used : AMQInvalidArgumentException(org.apache.qpid.server.filter.AMQInvalidArgumentException) NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) MessageSource(org.apache.qpid.server.message.MessageSource) AccessControlException(java.security.AccessControlException) Collection(java.util.Collection) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) ConcurrentLinkedQueue(java.util.concurrent.ConcurrentLinkedQueue) Queue(org.apache.qpid.server.model.Queue) HashSet(java.util.HashSet)

Aggregations

Queue (org.apache.qpid.server.model.Queue)56 HashMap (java.util.HashMap)14 Exchange (org.apache.qpid.server.model.Exchange)12 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 NamedAddressSpace (org.apache.qpid.server.model.NamedAddressSpace)6 Matchers.anyString (org.mockito.Matchers.anyString)6 ConcurrentLinkedQueue (java.util.concurrent.ConcurrentLinkedQueue)5 ServerMessage (org.apache.qpid.server.message.ServerMessage)5 AbstractConfiguredObject (org.apache.qpid.server.model.AbstractConfiguredObject)5 AccessControlException (java.security.AccessControlException)4 QmfAgentData (org.apache.qpid.qmf2.agent.QmfAgentData)4 AMQShortString (org.apache.qpid.server.protocol.v0_8.AMQShortString)4 MessagePublishInfo (org.apache.qpid.server.protocol.v0_8.transport.MessagePublishInfo)4 Map (java.util.Map)3 AMQMessageHeader (org.apache.qpid.server.message.AMQMessageHeader)3 ReplyTo (org.apache.qpid.server.protocol.v0_10.transport.ReplyTo)3 Source (org.apache.qpid.server.protocol.v1_0.type.messaging.Source)3