public void disablePort(PortConfiguration portConfiguration) throws Exception {
   JMSPortConfiguration jmsPortConfiguration = (JMSPortConfiguration) portConfiguration;
   if (jmsPortConfiguration.getPortType() == JMSPortConfiguration.PortType.QUEUE) {
     adminMBean.removeQueue(jmsPortConfiguration.getName());
   } else {
     adminMBean.removeTopic(jmsPortConfiguration.getName());
   }
 }
 public void stop() {
   try {
     if (adminMBean != null) {
       try {
         adminMBean.stop();
       } catch (InstanceNotFoundException e) {
         Logger myLogger = LoggerFactory.getLogger(Activator.class);
         myLogger.trace("Error stopping Admin MBean " + e.getMessage());
       }
     }
     if (connector != null) {
       connector.close();
     }
   } catch (Exception e) {
     // Ignore - could be because AMQ stopped.
   }
 }
  @Test(timeout = 60000)
  public void testDurableSubAndUnSubFlow() throws Exception {
    stompConnection.setVersion(Stomp.V1_1);

    String domain = "org.apache.activemq";
    ObjectName brokerName = new ObjectName(domain + ":type=Broker,brokerName=localhost");

    BrokerViewMBean view =
        (BrokerViewMBean)
            brokerService
                .getManagementContext()
                .newProxyInstance(brokerName, BrokerViewMBean.class, true);

    String connectFrame =
        "STOMP\n"
            + "login:system\n"
            + "passcode:manager\n"
            + "accept-version:1.1\n"
            + "host:localhost\n"
            + "client-id:test\n"
            + "\n"
            + Stomp.NULL;
    stompConnection.sendFrame(connectFrame);

    String frame = stompConnection.receiveFrame();
    LOG.debug("Broker sent: " + frame);

    assertTrue(frame.startsWith("CONNECTED"));
    assertEquals(view.getDurableTopicSubscribers().length, 0);

    // subscribe to first destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1"
            + "\n"
            + "ack:auto\n"
            + "receipt:1\n"
            + "id:durablesub-1\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    StompFrame receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("1", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 1);

    // attempt to remove the durable subscription while there is an active subscription
    frame =
        "UNSUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1\n"
            + "id:durablesub-1\n"
            + "receipt:3\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("ERROR"));
    assertEquals("3", receipt.getHeaders().get("receipt-id"));

    assertEquals(view.getInactiveDurableTopicSubscribers().length, 0);
    assertEquals(view.getDurableTopicSubscribers().length, 1);

    // attempt to remove the subscriber leaving the durable sub in place.
    frame =
        "UNSUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1\n"
            + "id:durablesub-1\n"
            + "receipt:4\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("4", receipt.getHeaders().get("receipt-id"));

    assertEquals(view.getInactiveDurableTopicSubscribers().length, 1);
    assertEquals(view.getDurableTopicSubscribers().length, 0);

    // attempt to remove the durable subscription which should succeed since there are no
    // active durable subscribers
    frame =
        "UNSUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1\n"
            + "id:durablesub-1\n"
            + "receipt:5\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("5", receipt.getHeaders().get("receipt-id"));

    assertEquals(view.getInactiveDurableTopicSubscribers().length, 0);
    assertEquals(view.getDurableTopicSubscribers().length, 0);
  }
  @Test(timeout = 60000)
  public void testMultipleDurableSubsWithOfflineMessages() throws Exception {
    stompConnection.setVersion(Stomp.V1_1);

    final BrokerViewMBean view = getProxyToBroker();

    String connectFrame =
        "STOMP\n"
            + "login:system\n"
            + "passcode:manager\n"
            + "accept-version:1.1\n"
            + "host:localhost\n"
            + "client-id:test\n"
            + "\n"
            + Stomp.NULL;
    stompConnection.sendFrame(connectFrame);

    String frame = stompConnection.receiveFrame();
    LOG.debug("Broker sent: " + frame);

    assertTrue(frame.startsWith("CONNECTED"));
    assertEquals(view.getDurableTopicSubscribers().length, 0);

    // subscribe to first destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1"
            + "\n"
            + "ack:auto\n"
            + "receipt:1\n"
            + "id:durablesub-1\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    StompFrame receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("1", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 1);

    // subscribe to second destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "2"
            + "\n"
            + "ack:auto\n"
            + "receipt:2\n"
            + "id:durablesub-2\n"
            + "activemq.subscriptionName:test2\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("2", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 2);

    frame = "DISCONNECT\nclient-id:test\n\n" + Stomp.NULL;
    stompConnection.sendFrame(frame);
    assertTrue(
        Wait.waitFor(
            new Wait.Condition() {

              @Override
              public boolean isSatisified() throws Exception {
                return view.getCurrentConnectionsCount() == 1;
              }
            },
            TimeUnit.SECONDS.toMillis(5),
            TimeUnit.MILLISECONDS.toMillis(25)));

    // reconnect and send some messages to the offline subscribers and then try to get
    // them after subscribing again.
    stompConnect();
    stompConnection.sendFrame(connectFrame);
    frame = stompConnection.receiveFrame();
    LOG.debug("Broker sent: " + frame);
    assertTrue(frame.contains("CONNECTED"));
    assertEquals(view.getDurableTopicSubscribers().length, 0);
    assertEquals(view.getInactiveDurableTopicSubscribers().length, 2);

    frame =
        "SEND\n"
            + "destination:/topic/"
            + getQueueName()
            + "1\n"
            + "receipt:10\n"
            + "\n"
            + "Hello World 1"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    assertEquals("10", receipt.getHeaders().get(Stomp.Headers.Response.RECEIPT_ID));

    frame =
        "SEND\n"
            + "destination:/topic/"
            + getQueueName()
            + "2\n"
            + "receipt:11\n"
            + "\n"
            + "Hello World 2"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    assertEquals("11", receipt.getHeaders().get(Stomp.Headers.Response.RECEIPT_ID));

    // subscribe to first destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1"
            + "\n"
            + "ack:auto\n"
            + "receipt:3\n"
            + "id:durablesub-1\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("3", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 1);

    StompFrame message = stompConnection.receive();
    assertEquals(Stomp.Responses.MESSAGE, message.getAction());
    assertEquals("durablesub-1", message.getHeaders().get(Stomp.Headers.Message.SUBSCRIPTION));

    assertEquals(view.getDurableTopicSubscribers().length, 1);
    assertEquals(view.getInactiveDurableTopicSubscribers().length, 1);

    // subscribe to second destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "2"
            + "\n"
            + "ack:auto\n"
            + "receipt:4\n"
            + "id:durablesub-2\n"
            + "activemq.subscriptionName:test2\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("4", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 2);

    message = stompConnection.receive();
    assertEquals(Stomp.Responses.MESSAGE, message.getAction());
    assertEquals("durablesub-2", message.getHeaders().get(Stomp.Headers.Message.SUBSCRIPTION));

    assertEquals(view.getDurableTopicSubscribers().length, 2);
    assertEquals(view.getInactiveDurableTopicSubscribers().length, 0);
  }
  @Test(timeout = 60000)
  public void testDurableSubAndUnSubOnTwoTopics() throws Exception {
    stompConnection.setVersion(Stomp.V1_1);

    String domain = "org.apache.activemq";
    ObjectName brokerName = new ObjectName(domain + ":type=Broker,brokerName=localhost");

    BrokerViewMBean view =
        (BrokerViewMBean)
            brokerService
                .getManagementContext()
                .newProxyInstance(brokerName, BrokerViewMBean.class, true);

    String connectFrame =
        "STOMP\n"
            + "login:system\n"
            + "passcode:manager\n"
            + "accept-version:1.1\n"
            + "host:localhost\n"
            + "client-id:test\n"
            + "\n"
            + Stomp.NULL;
    stompConnection.sendFrame(connectFrame);

    String frame = stompConnection.receiveFrame();
    LOG.debug("Broker sent: " + frame);

    assertTrue(frame.startsWith("CONNECTED"));
    assertEquals(view.getDurableTopicSubscribers().length, 0);

    // subscribe to first destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1"
            + "\n"
            + "ack:auto\n"
            + "receipt:1\n"
            + "id:durablesub-1\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    StompFrame receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("1", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 1);

    // subscribe to second destination durably
    frame =
        "SUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "2"
            + "\n"
            + "ack:auto\n"
            + "receipt:2\n"
            + "id:durablesub-2\n"
            + "activemq.subscriptionName:test2\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);

    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + receipt);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("2", receipt.getHeaders().get("receipt-id"));
    assertEquals(view.getDurableTopicSubscribers().length, 2);

    frame = "DISCONNECT\nclient-id:test\n\n" + Stomp.NULL;
    stompConnection.sendFrame(frame);
    Wait.waitFor(
        new Wait.Condition() {

          @Override
          public boolean isSatisified() throws Exception {
            return getProxyToBroker().getCurrentConnectionsCount() == 0;
          }
        },
        TimeUnit.SECONDS.toMillis(5),
        TimeUnit.MILLISECONDS.toMillis(25));

    // reconnect and send some messages to the offline subscribers and then try to get
    // them after subscribing again.
    stompConnect();
    stompConnection.sendFrame(connectFrame);
    frame = stompConnection.receiveFrame();
    LOG.debug("Broker sent: " + frame);
    assertTrue(frame.startsWith("CONNECTED"));
    assertEquals(view.getDurableTopicSubscribers().length, 0);
    assertEquals(view.getInactiveDurableTopicSubscribers().length, 2);

    // unsubscribe from topic 1
    frame =
        "UNSUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "1\n"
            + "id:durablesub-1\n"
            + "receipt:3\n"
            + "activemq.subscriptionName:test1\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + frame);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("3", receipt.getHeaders().get("receipt-id"));

    assertEquals(view.getInactiveDurableTopicSubscribers().length, 1);

    // unsubscribe from topic 2
    frame =
        "UNSUBSCRIBE\n"
            + "destination:/topic/"
            + getQueueName()
            + "2\n"
            + "id:durablesub-2\n"
            + "receipt:4\n"
            + "activemq.subscriptionName:test2\n\n"
            + Stomp.NULL;
    stompConnection.sendFrame(frame);
    receipt = stompConnection.receive();
    LOG.debug("Broker sent: " + frame);
    assertTrue(receipt.getAction().startsWith("RECEIPT"));
    assertEquals("4", receipt.getHeaders().get("receipt-id"));

    assertEquals(view.getInactiveDurableTopicSubscribers().length, 0);
  }