public void destroy() {
    super.destroy();
    for (String key : new ArrayList<String>(serverMap.keySet())) {
      ExchangeServer server = serverMap.remove(key);
      if (server != null) {
        try {
          if (logger.isInfoEnabled()) {
            logger.info("Close dubbo server: " + server.getLocalAddress());
          }
          server.close(getServerShutdownTimeout());
        } catch (Throwable t) {
          logger.warn(t.getMessage(), t);
        }
      }
    }

    for (String key : new ArrayList<String>(referenceClientMap.keySet())) {
      ExchangeClient client = referenceClientMap.remove(key);
      if (client != null) {
        try {
          if (logger.isInfoEnabled()) {
            logger.info(
                "Close dubbo connect: "
                    + client.getLocalAddress()
                    + "-->"
                    + client.getRemoteAddress());
          }
          client.close();
        } catch (Throwable t) {
          logger.warn(t.getMessage(), t);
        }
      }
    }

    for (String key : new ArrayList<String>(ghostClientMap.keySet())) {
      ExchangeClient client = ghostClientMap.remove(key);
      if (client != null) {
        try {
          if (logger.isInfoEnabled()) {
            logger.info(
                "Close dubbo connect: "
                    + client.getLocalAddress()
                    + "-->"
                    + client.getRemoteAddress());
          }
          client.close();
        } catch (Throwable t) {
          logger.warn(t.getMessage(), t);
        }
      }
    }
  }