public void testQueuePriority() throws Exception {
    // Set up queue with 5 priorities
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues(-1).queue(-1).name(-1)", "atest");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues.queue.atest(-1).exchange",
            "amq.direct");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues.queue.atest.priorities", "5");

    // Set up queue with JMS style priorities
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues(-1).queue(-1).name(-1)", "ptest");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues.queue.ptest(-1).exchange",
            "amq.direct");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues.queue.ptest.priority", "true");

    // Set up queue with no priorities
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues(-1).queue(-1).name(-1)", "ntest");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues.queue.ntest(-1).exchange",
            "amq.direct");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueuePriority.queues.queue.ntest.priority", "false");

    // Start the broker now.
    super.createBroker();

    VirtualHost vhost =
        ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost(getName());

    // Check that atest was a priority queue with 5 priorities
    AMQQueue atest = vhost.getQueueRegistry().getQueue(new AMQShortString("atest"));
    assertTrue(atest instanceof AMQPriorityQueue);
    assertEquals(5, ((AMQPriorityQueue) atest).getPriorities());

    // Check that ptest was a priority queue with 10 priorities
    AMQQueue ptest = vhost.getQueueRegistry().getQueue(new AMQShortString("ptest"));
    assertTrue(ptest instanceof AMQPriorityQueue);
    assertEquals(10, ((AMQPriorityQueue) ptest).getPriorities());

    // Check that ntest wasn't a priority queue
    AMQQueue ntest = vhost.getQueueRegistry().getQueue(new AMQShortString("ntest"));
    assertFalse(ntest instanceof AMQPriorityQueue);
  }
  public void testQueueAlerts() throws Exception {
    // Set up queue with 5 priorities
    getConfigXml()
        .addProperty("virtualhosts.virtualhost.testQueueAlerts.queues.exchange", "amq.topic");
    getConfigXml()
        .addProperty("virtualhosts.virtualhost.testQueueAlerts.queues.maximumQueueDepth", "1");
    getConfigXml()
        .addProperty("virtualhosts.virtualhost.testQueueAlerts.queues.maximumMessageSize", "2");
    getConfigXml()
        .addProperty("virtualhosts.virtualhost.testQueueAlerts.queues.maximumMessageAge", "3");

    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueueAlerts.queues(-1).queue(1).name(1)", "atest");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueueAlerts.queues.queue.atest(-1).exchange",
            "amq.direct");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueueAlerts.queues.queue.atest(-1).maximumQueueDepth",
            "4");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueueAlerts.queues.queue.atest(-1).maximumMessageSize",
            "5");
    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueueAlerts.queues.queue.atest(-1).maximumMessageAge",
            "6");

    getConfigXml()
        .addProperty(
            "virtualhosts.virtualhost.testQueueAlerts.queues(-1).queue(-1).name(-1)", "btest");

    // Start the broker now.
    super.createBroker();

    VirtualHost vhost =
        ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost(getName());

    // Check specifically configured values
    AMQQueue aTest = vhost.getQueueRegistry().getQueue(new AMQShortString("atest"));
    assertEquals(4, aTest.getMaximumQueueDepth());
    assertEquals(5, aTest.getMaximumMessageSize());
    assertEquals(6, aTest.getMaximumMessageAge());

    // Check default values
    AMQQueue bTest = vhost.getQueueRegistry().getQueue(new AMQShortString("btest"));
    assertEquals(1, bTest.getMaximumQueueDepth());
    assertEquals(2, bTest.getMaximumMessageSize());
    assertEquals(3, bTest.getMaximumMessageAge());
  }
  protected AMQQueue createQueue(
      final AMQShortString queueName,
      QueueDeclareBody body,
      VirtualHost virtualHost,
      final AMQProtocolSession session)
      throws AMQException {
    final QueueRegistry registry = virtualHost.getQueueRegistry();
    AMQShortString owner = body.getExclusive() ? session.getContextKey() : null;

    final AMQQueue queue =
        AMQQueueFactory.createAMQQueueImpl(
            queueName,
            body.getDurable(),
            owner,
            body.getAutoDelete(),
            body.getExclusive(),
            virtualHost,
            body.getArguments());

    if (body.getExclusive() && !body.getDurable()) {
      final AMQProtocolSession.Task deleteQueueTask =
          new AMQProtocolSession.Task() {
            public void doTask(AMQProtocolSession session) throws AMQException {
              if (registry.getQueue(queueName) == queue) {
                queue.delete();
              }
            }
          };

      session.addSessionCloseTask(deleteQueueTask);

      queue.addQueueDeleteTask(
          new AMQQueue.Task() {
            public void doTask(AMQQueue queue) {
              session.removeSessionCloseTask(deleteQueueTask);
            }
          });
    }

    return queue;
  }
Example #4
0
  public static AMQQueue createAMQQueueImpl(
      String queueName,
      boolean durable,
      String owner,
      boolean autoDelete,
      boolean exclusive,
      VirtualHost virtualHost,
      Map<String, Object> arguments)
      throws AMQSecurityException {
    // Access check
    if (!virtualHost
        .getSecurityManager()
        .authoriseCreateQueue(
            autoDelete, durable, exclusive, null, null, new AMQShortString(queueName), owner)) {
      String description = "Permission denied: queue-name '" + queueName + "'";
      throw new AMQSecurityException(description);
    }

    int priorities = 1;
    String conflationKey = null;
    if (arguments != null) {
      if (arguments.containsKey(QPID_LAST_VALUE_QUEUE)
          || arguments.containsKey(QPID_LAST_VALUE_QUEUE_KEY)) {
        conflationKey = (String) arguments.get(QPID_LAST_VALUE_QUEUE_KEY);
        if (conflationKey == null) {
          conflationKey = QPID_LVQ_KEY;
        }
      } else if (arguments.containsKey(X_QPID_PRIORITIES.toString())) {
        Object prioritiesObj = arguments.get(X_QPID_PRIORITIES.toString());
        if (prioritiesObj instanceof Number) {
          priorities = ((Number) prioritiesObj).intValue();
        }
      }
    }

    AMQQueue q;
    if (conflationKey != null) {
      q =
          new ConflationQueue(
              queueName,
              durable,
              owner,
              autoDelete,
              exclusive,
              virtualHost,
              arguments,
              conflationKey);
    } else if (priorities > 1) {
      q =
          new AMQPriorityQueue(
              queueName, durable, owner, autoDelete, exclusive, virtualHost, priorities, arguments);
    } else {
      q =
          new SimpleAMQQueue(
              queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments);
    }

    // Register the new queue
    virtualHost.getQueueRegistry().registerQueue(q);
    q.configure(virtualHost.getConfiguration().getQueueConfiguration(queueName));

    if (arguments != null) {
      for (QueueProperty p : DECLAREABLE_PROPERTIES) {
        if (arguments.containsKey(p.getArgumentName().toString())) {
          p.setPropertyValue(q, arguments.get(p.getArgumentName().toString()));
        }
      }
    }

    return q;
  }
  public void methodReceived(AMQStateManager stateManager, QueueDeclareBody body, int channelId)
      throws AMQException {
    final AMQProtocolSession protocolConnection = stateManager.getProtocolSession();
    final AMQSessionModel session = protocolConnection.getChannel(channelId);
    VirtualHost virtualHost = protocolConnection.getVirtualHost();
    ExchangeRegistry exchangeRegistry = virtualHost.getExchangeRegistry();
    QueueRegistry queueRegistry = virtualHost.getQueueRegistry();
    DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();

    final AMQShortString queueName;

    // if we aren't given a queue name, we create one which we return to the client
    if ((body.getQueue() == null) || (body.getQueue().length() == 0)) {
      queueName = createName();
    } else {
      queueName = body.getQueue().intern();
    }

    AMQQueue queue;

    // TODO: do we need to check that the queue already exists with exactly the same
    // "configuration"?

    synchronized (queueRegistry) {
      queue = queueRegistry.getQueue(queueName);

      AMQSessionModel owningSession = null;

      if (queue != null) {
        owningSession = queue.getExclusiveOwningSession();
      }

      if (queue == null) {
        if (body.getPassive()) {
          String msg = "Queue: " + queueName + " not found on VirtualHost(" + virtualHost + ").";
          throw body.getChannelException(AMQConstant.NOT_FOUND, msg);
        } else {
          queue = createQueue(queueName, body, virtualHost, protocolConnection);
          queue.setAuthorizationHolder(protocolConnection);
          if (queue.isDurable() && !queue.isAutoDelete()) {
            store.createQueue(queue, body.getArguments());

            // Tell Andes kernel to create queue
            QpidAndesBridge.createQueue(queue);
          }
          if (body.getAutoDelete()) {
            queue.setDeleteOnNoConsumers(true);
          }
          queueRegistry.registerQueue(queue);
          if (body.getExclusive()) {
            queue.setExclusiveOwningSession(protocolConnection.getChannel(channelId));
            queue.setAuthorizationHolder(protocolConnection);

            if (!body.getDurable()) {
              final AMQQueue q = queue;
              final AMQProtocolSession.Task sessionCloseTask =
                  new AMQProtocolSession.Task() {
                    public void doTask(AMQProtocolSession session) throws AMQException {
                      q.setExclusiveOwningSession(null);
                    }
                  };
              protocolConnection.addSessionCloseTask(sessionCloseTask);
              queue.addQueueDeleteTask(
                  new AMQQueue.Task() {
                    public void doTask(AMQQueue queue) throws AMQException {
                      protocolConnection.removeSessionCloseTask(sessionCloseTask);
                    }
                  });
            }
          }
          if (autoRegister) {
            Exchange defaultExchange = exchangeRegistry.getDefaultExchange();

            virtualHost
                .getBindingFactory()
                .addBinding(
                    String.valueOf(queueName), queue, defaultExchange, Collections.EMPTY_MAP);
            _logger.info(
                "Queue "
                    + queueName
                    + " bound to default exchange("
                    + defaultExchange.getNameShortString()
                    + ")");
          }
        }
      } else if (queue.isExclusive()
          && !queue.isDurable()
          && (owningSession == null || owningSession.getConnectionModel() != protocolConnection)) {
        throw body.getConnectionException(
            AMQConstant.NOT_ALLOWED,
            "Queue "
                + queue.getNameShortString()
                + " is exclusive, but not created on this Connection.");
      } else if (!body.getPassive() && ((queue.isExclusive()) != body.getExclusive())) {

        throw body.getChannelException(
            AMQConstant.ALREADY_EXISTS,
            "Cannot re-declare queue '"
                + queue.getNameShortString()
                + "' with different exclusivity (was: "
                + queue.isExclusive()
                + " requested "
                + body.getExclusive()
                + ")");
      } else if (!body.getPassive()
          && body.getExclusive()
          && !(queue.isDurable()
              ? String.valueOf(queue.getOwner()).equals(session.getClientID())
              : (owningSession == null
                  || owningSession.getConnectionModel() == protocolConnection))) {
        throw body.getChannelException(
            AMQConstant.ALREADY_EXISTS,
            "Cannot declare queue('"
                + queueName
                + "'), "
                + "as exclusive queue with same name "
                + "declared on another client ID('"
                + queue.getOwner()
                + "') your clientID('"
                + session.getClientID()
                + "')");

      } else if (!body.getPassive() && queue.isAutoDelete() != body.getAutoDelete()) {
        throw body.getChannelException(
            AMQConstant.ALREADY_EXISTS,
            "Cannot re-declare queue '"
                + queue.getNameShortString()
                + "' with different auto-delete (was: "
                + queue.isAutoDelete()
                + " requested "
                + body.getAutoDelete()
                + ")");
      } else if (!body.getPassive() && queue.isDurable() != body.getDurable()) {
        throw body.getChannelException(
            AMQConstant.ALREADY_EXISTS,
            "Cannot re-declare queue '"
                + queue.getNameShortString()
                + "' with different durability (was: "
                + queue.isDurable()
                + " requested "
                + body.getDurable()
                + ")");
      }

      AMQChannel channel = protocolConnection.getChannel(channelId);

      if (channel == null) {
        throw body.getChannelNotFoundException(channelId);
      }

      // set this as the default queue on the channel:
      channel.setDefaultQueue(queue);
    }

    if (!body.getNowait()) {
      MethodRegistry methodRegistry = protocolConnection.getMethodRegistry();
      QueueDeclareOkBody responseBody =
          methodRegistry.createQueueDeclareOkBody(
              queueName, queue.getMessageCount(), queue.getConsumerCount());
      protocolConnection.writeFrame(responseBody.generateFrame(channelId));

      _logger.info("Queue " + queueName + " declared successfully");
    }
  }