Beispiel #1
0
  @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);
  }
Beispiel #2
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);
  }
Beispiel #3
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);
  }