@Test
  public void testStopAlreadyStoppedSession() throws Exception {
    ClientSessionFactory sf = createSessionFactory(locator);

    final ClientSession session = sf.createSession(false, true, true);

    session.createQueue(QUEUE, QUEUE, null, false);

    ClientProducer producer = session.createProducer(QUEUE);

    final int numMessages = 100;

    for (int i = 0; i < numMessages; i++) {
      ClientMessage message = createTextMessage(session, "m" + i);
      message.putIntProperty(new SimpleString("i"), i);
      producer.send(message);
    }

    final ClientConsumer consumer = session.createConsumer(QUEUE);

    session.start();

    for (int i = 0; i < numMessages / 2; i++) {
      ClientMessage cm = consumer.receive(5000);
      Assert.assertNotNull(cm);
      cm.acknowledge();
    }
    session.stop();
    ClientMessage cm = consumer.receiveImmediate();
    Assert.assertNull(cm);

    session.stop();
    cm = consumer.receiveImmediate();
    Assert.assertNull(cm);

    session.start();
    for (int i = 0; i < numMessages / 2; i++) {
      cm = consumer.receive(5000);
      Assert.assertNotNull(cm);
      cm.acknowledge();
    }

    session.close();
  }
  @Test
  public void testStopStartConsumerAsyncSync() throws Exception {
    ClientSessionFactory sf = createSessionFactory(locator);

    final ClientSession session = sf.createSession(false, true, true);

    session.createQueue(QUEUE, QUEUE, null, false);

    ClientProducer producer = session.createProducer(QUEUE);

    final int numMessages = 100;

    for (int i = 0; i < numMessages; i++) {
      ClientMessage message = createTextMessage(session, "m" + i);
      message.putIntProperty(new SimpleString("i"), i);
      producer.send(message);
    }

    final ClientConsumer consumer = session.createConsumer(QUEUE);

    session.start();

    final CountDownLatch latch = new CountDownLatch(10);

    // Message should be in consumer

    class MyHandler implements MessageHandler {

      boolean failed;

      boolean started = true;

      @Override
      public void onMessage(final ClientMessage message) {

        try {
          if (!started) {
            failed = true;
          }

          latch.countDown();

          if (latch.getCount() == 0) {

            message.acknowledge();
            started = false;
            consumer.setMessageHandler(null);
          }

        } catch (Exception e) {
        }
      }
    }

    MyHandler handler = new MyHandler();

    consumer.setMessageHandler(handler);

    waitForLatch(latch);

    try {
      session.stop();
    } catch (Exception e) {
      SessionStopStartTest.log.warn(e.getMessage(), e);
      throw e;
    }

    Assert.assertFalse(handler.failed);

    // Make sure no exceptions were thrown from onMessage
    Assert.assertNull(consumer.getLastException());
    consumer.setMessageHandler(null);
    session.start();
    for (int i = 0; i < 90; i++) {
      ClientMessage msg = consumer.receive(1000);
      if (msg == null) {
        System.out.println("ClientConsumerTest.testStopConsumer");
      }
      Assert.assertNotNull("message " + i, msg);
      msg.acknowledge();
    }

    Assert.assertNull(consumer.receiveImmediate());

    session.close();
  }