/*
   * (non-Javadoc)
   *
   * @see javax.jms.Connection#close()
   */
  @Override
  public void close() throws JMSException {
    stop();

    for (HazelcastMQJmsSession session : sessionMap.values()) {
      session.close();
    }
    sessionMap.clear();

    mqContext.close();
    mqContext = null;
  }
  /*
   * (non-Javadoc)
   *
   * @see javax.jms.Connection#createSession(boolean, int)
   */
  @Override
  public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException {
    // acknowledgeMode isn't supported.

    HazelcastMQJmsSession session = new HazelcastMQJmsSession(this, transacted);
    sessionMap.put(session.getId(), session);

    if (active) {
      session.start();
    }

    return session;
  }
  /*
   * (non-Javadoc)
   *
   * @see javax.jms.Connection#stop()
   */
  @Override
  public void stop() throws JMSException {
    if (!active) {
      return;
    }

    active = false;

    for (HazelcastMQJmsSession session : sessionMap.values()) {
      session.stop();
    }

    mqContext.stop();
  }
  /*
   * (non-Javadoc)
   *
   * @see javax.jms.Connection#start()
   */
  @Override
  public void start() throws JMSException {
    if (active) {
      return;
    }

    active = true;

    mqContext.start();

    for (HazelcastMQJmsSession session : sessionMap.values()) {
      session.start();
    }
  }
 /**
  * Indicates that the given session has been closed and no longer needs to be tracked.
  *
  * @param session the session that was closed
  */
 void onSessionClosed(HazelcastMQJmsSession session) {
   sessionMap.remove(session.getId());
 }