Esempio n. 1
0
  public void testFlowControlProperties() throws Exception {
    assertTrue(_queueMBean.getCapacity() == 0);
    assertTrue(_queueMBean.getFlowResumeCapacity() == 0);
    assertFalse(_queueMBean.isFlowOverfull());

    // capacity currently 0, try setting FlowResumeCapacity above this
    try {
      _queueMBean.setFlowResumeCapacity(1L);
      fail("Should have failed to allow setting FlowResumeCapacity above Capacity");
    } catch (IllegalArgumentException ex) {
      // expected exception
      assertTrue(_queueMBean.getFlowResumeCapacity() == 0);
    }

    // add a message to the queue
    sendMessages(1, true);

    // (FlowResume)Capacity currently 0, set both to 2
    _queueMBean.setCapacity(2L);
    assertTrue(_queueMBean.getCapacity() == 2L);
    _queueMBean.setFlowResumeCapacity(2L);
    assertTrue(_queueMBean.getFlowResumeCapacity() == 2L);

    // Try setting Capacity below FlowResumeCapacity
    try {
      _queueMBean.setCapacity(1L);
      fail("Should have failed to allow setting Capacity below FlowResumeCapacity");
    } catch (IllegalArgumentException ex) {
      // expected exception
      assertTrue(_queueMBean.getCapacity() == 2);
    }

    // create a channel and use it to exercise the capacity check mechanism
    AMQChannel channel = new AMQChannel(getSession(), 1, getMessageStore());
    getQueue().checkCapacity(channel);

    assertTrue(_queueMBean.isFlowOverfull());
    assertTrue(channel.getBlocking());

    // set FlowResumeCapacity to MESSAGE_SIZE and check queue is now underfull and channel unblocked
    _queueMBean.setCapacity(MESSAGE_SIZE); // must increase capacity too
    _queueMBean.setFlowResumeCapacity(MESSAGE_SIZE);

    assertFalse(_queueMBean.isFlowOverfull());
    assertFalse(channel.getBlocking());
  }
Esempio n. 2
0
 /** {@inheritDoc} */
 @Override
 public void forcefullyDisconnect() throws AndesException {
   try {
     channel.mgmtClose();
   } catch (AMQException e) {
     throw new AndesException(e);
   }
 }
  public void methodReceived(AMQStateManager stateManager, BasicRecoverBody body, int channelId)
      throws AMQException {
    AMQProtocolSession session = stateManager.getProtocolSession();

    _logger.debug("Recover received on protocol session " + session + " and channel " + channelId);
    AMQChannel channel = session.getChannel(channelId);

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

    channel.resend(body.getRequeue());

    // Qpid 0-8 hacks a synchronous -ok onto recover.
    // In Qpid 0-9 we create a separate sync-recover, sync-recover-ok pair to be "more" compliant
    if (session.getProtocolVersion().equals(ProtocolVersion.v8_0)) {
      MethodRegistry_8_0 methodRegistry = (MethodRegistry_8_0) session.getMethodRegistry();
      AMQMethodBody recoverOk = methodRegistry.createBasicRecoverOkBody();
      session.writeFrame(recoverOk.generateFrame(channelId));
    }
  }
Esempio n. 4
0
  public void testConsumerCount() throws AMQException {

    assertTrue(getQueue().getActiveConsumerCount() == 0);
    assertTrue(_queueMBean.getActiveConsumerCount() == 0);

    InternalTestProtocolSession protocolSession = new InternalTestProtocolSession(getVirtualHost());

    AMQChannel channel = new AMQChannel(protocolSession, 1, getMessageStore());
    protocolSession.addChannel(channel);

    Subscription subscription =
        SUBSCRIPTION_FACTORY.createSubscription(
            channel.getChannelId(),
            protocolSession,
            new AMQShortString("test"),
            false,
            null,
            false,
            channel.getCreditManager());

    getQueue().registerSubscription(subscription, false);
    assertEquals(1, (int) _queueMBean.getActiveConsumerCount());

    SubscriptionFactory subscriptionFactory = SUBSCRIPTION_FACTORY;
    Subscription s1 =
        subscriptionFactory.createSubscription(
            channel.getChannelId(),
            protocolSession,
            new AMQShortString("S1"),
            false,
            null,
            true,
            channel.getCreditManager());

    Subscription s2 =
        subscriptionFactory.createSubscription(
            channel.getChannelId(),
            protocolSession,
            new AMQShortString("S2"),
            false,
            null,
            true,
            channel.getCreditManager());
    getQueue().registerSubscription(s1, false);
    getQueue().registerSubscription(s2, false);
    assertTrue(_queueMBean.getActiveConsumerCount() == 3);
    assertTrue(_queueMBean.getConsumerCount() == 3);

    s1.close();
    assertEquals(2, (int) _queueMBean.getActiveConsumerCount());
    assertTrue(_queueMBean.getConsumerCount() == 3);
  }
Esempio n. 5
0
  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");
    }
  }
Esempio n. 6
0
 @Override
 public UUID getChannelID() {
   return channel.getId();
 }