@Test
  public void testCreateDurableQueueUsingJMSAndRestartServer() throws Exception {
    String queueName = RandomUtil.randomString();
    String binding = RandomUtil.randomString();

    ActiveMQTestBase.checkNoBinding(context, binding);
    checkNoResource(ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queueName));

    TransportConfiguration config =
        new TransportConfiguration(InVMConnectorFactory.class.getName());
    Connection connection =
        ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, config)
            .createConnection();
    connection.start();
    Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management");
    QueueSession session = (QueueSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    QueueRequestor requestor = new QueueRequestor(session, managementQueue);
    Message message = session.createMessage();
    JMSManagementHelper.putOperationInvocation(
        message, "jms.server", "createQueue", queueName, binding);
    Message reply = requestor.request(message);
    Assert.assertTrue(JMSManagementHelper.hasOperationSucceeded(reply));
    connection.close();

    Object o = ActiveMQTestBase.checkBinding(context, binding);
    Assert.assertTrue(o instanceof Queue);
    Queue queue = (Queue) o;
    Assert.assertEquals(queueName, queue.getQueueName());
    checkResource(ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queueName));

    serverManager.stop();

    ActiveMQTestBase.checkNoBinding(context, binding);
    checkNoResource(ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queueName));

    serverManager = createJMSServer();
    serverManager.start();

    o = ActiveMQTestBase.checkBinding(context, binding);
    Assert.assertTrue(o instanceof Queue);
    queue = (Queue) o;
    Assert.assertEquals(queueName, queue.getQueueName());
    checkResource(ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queueName));
  }
  public void send(ExampleCommand command, String queueName, String filter)
      throws JMSException, IOException {
    try (Session session = connection.createSession()) {

      Message message;
      if (binaryMode) {
        message = session.createBytesMessage();
        ((BytesMessage) message).writeBytes(command.toBytes());
      } else {
        message = session.createTextMessage(command.toXml());
      }

      if (filter != null && !blank(filter)) {
        String[] parts = filter.split("\\s*=\\s*");
        message.setStringProperty(parts[0], parts[1]);
      }
      try (MessageProducer p = session.createProducer(ActiveMQJMSClient.createQueue(queueName))) {
        p.send(message, DeliveryMode.PERSISTENT, 4, 0);
      }
    }
  }
  public static void main(final String[] args) throws Exception {
    Connection connection0 = null;

    Connection connection1 = null;

    Connection connection2 = null;

    Connection connection3 = null;

    Connection connection4 = null;

    Connection connection5 = null;

    try {
      // Step 1 - We instantiate a connection factory directly, specifying the UDP address and port
      // for discovering
      // the list of servers in the cluster.
      // We could use JNDI to look-up a connection factory, but we'd need to know the JNDI server
      // host and port for
      // the
      // specific server to do that, and that server might not be available at the time. By creating
      // the
      // connection factory directly we avoid having to worry about a JNDI look-up.
      // In an app server environment you could use HA-JNDI to lookup from the clustered JNDI
      // servers without
      // having to know about a specific one.
      UDPBroadcastEndpointFactory udpCfg = new UDPBroadcastEndpointFactory();
      udpCfg.setGroupAddress("231.7.7.7").setGroupPort(9876);
      DiscoveryGroupConfiguration groupConfiguration = new DiscoveryGroupConfiguration();
      groupConfiguration.setBroadcastEndpointFactory(udpCfg);

      ConnectionFactory cf =
          ActiveMQJMSClient.createConnectionFactoryWithHA(groupConfiguration, JMSFactoryType.CF);

      // We give a little while for each server to broadcast its whereabouts to the client
      Thread.sleep(2000);

      // Step 2. Directly instantiate JMS Queue and Topic objects
      Queue queue = ActiveMQJMSClient.createQueue("exampleQueue");

      Topic topic = ActiveMQJMSClient.createTopic("exampleTopic");

      // Step 3. We create six connections, they should be to different nodes of the cluster in a
      // round-robin fashion
      // and start them
      connection0 = cf.createConnection();

      connection1 = cf.createConnection();

      connection2 = cf.createConnection();

      connection3 = cf.createConnection();

      connection4 = cf.createConnection();

      connection5 = cf.createConnection();

      connection0.start();

      connection1.start();

      connection2.start();

      connection3.start();

      connection4.start();

      connection5.start();

      // Step 4. We create a session on each connection

      Session session0 = connection0.createSession(false, Session.AUTO_ACKNOWLEDGE);

      Session session1 = connection1.createSession(false, Session.AUTO_ACKNOWLEDGE);

      Session session2 = connection2.createSession(false, Session.AUTO_ACKNOWLEDGE);

      Session session3 = connection0.createSession(false, Session.AUTO_ACKNOWLEDGE);

      Session session4 = connection1.createSession(false, Session.AUTO_ACKNOWLEDGE);

      Session session5 = connection2.createSession(false, Session.AUTO_ACKNOWLEDGE);

      // Step 5. We create a topic subscriber on each server

      MessageConsumer subscriber0 = session0.createConsumer(topic);

      MessageConsumer subscriber1 = session1.createConsumer(topic);

      MessageConsumer subscriber2 = session2.createConsumer(topic);

      MessageConsumer subscriber3 = session3.createConsumer(topic);

      MessageConsumer subscriber4 = session4.createConsumer(topic);

      MessageConsumer subscriber5 = session5.createConsumer(topic);

      // Step 6. We create a queue consumer on server 0

      MessageConsumer consumer0 = session0.createConsumer(queue);

      // Step 7. We create an anonymous message producer on just one server 2

      MessageProducer producer2 = session2.createProducer(null);

      // Step 8. We send 500 messages each to the queue and topic

      final int numMessages = 500;

      for (int i = 0; i < numMessages; i++) {
        TextMessage message1 = session2.createTextMessage("Topic message " + i);

        producer2.send(topic, message1);

        TextMessage message2 = session2.createTextMessage("Queue message " + i);

        producer2.send(queue, message2);
      }

      // Step 9. Verify all subscribers and the consumer receive the messages

      for (int i = 0; i < numMessages; i++) {
        TextMessage received0 = (TextMessage) subscriber0.receive(5000);

        if (received0 == null) {
          throw new IllegalStateException("Message is null!");
        }

        TextMessage received1 = (TextMessage) subscriber1.receive(5000);

        if (received1 == null) {
          throw new IllegalStateException("Message is null!");
        }

        TextMessage received2 = (TextMessage) subscriber2.receive(5000);

        if (received2 == null) {
          throw new IllegalStateException("Message is null!");
        }

        TextMessage received3 = (TextMessage) subscriber3.receive(5000);

        if (received3 == null) {
          throw new IllegalStateException("Message is null!");
        }

        TextMessage received4 = (TextMessage) subscriber4.receive(5000);

        if (received4 == null) {
          throw new IllegalStateException("Message is null!");
        }

        TextMessage received5 = (TextMessage) subscriber5.receive(5000);

        if (received5 == null) {
          throw new IllegalStateException("Message is null!");
        }

        TextMessage received6 = (TextMessage) consumer0.receive(5000);

        if (received6 == null) {
          throw new IllegalStateException("Message is null!");
        }
      }
    } finally {
      // Step 15. Be sure to close our resources!

      connection0.close();
      connection1.close();
      connection2.close();
      connection3.close();
      connection4.close();
      connection5.close();
    }
  }