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());
}
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);
}
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());
}
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()));
}
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);
}
}
}
Aggregations