@Override
  public void contextDestroyed(ServletContextEvent sce) {
    logger.info("destroyed DefaultContextListener.");
    try {
      // 关闭线程池
      AppExecutors.getScheduledExecutor().shutdown();
      AppExecutors.getTaskPoolExecutor().shutdown();
      if (AppExecutors.getScheduledExecutor().awaitTermination(5, TimeUnit.SECONDS)) {
        logger.info("success shutdown scheduled pool excutor.");
      } else {
        logger.error("failed shutdown scheduled pool excutor.");
        AppExecutors.getScheduledExecutor().shutdownNow();
      }

      if (AppExecutors.getTaskPoolExecutor().awaitTermination(5, TimeUnit.SECONDS)) {
        logger.info("success shutdown task pool excutor.");
      } else {
        logger.error("failed shutdown task pool excutor.");
        AppExecutors.getTaskPoolExecutor().shutdownNow();
      }

    } catch (Exception e) {
      if (!AppExecutors.getTaskPoolExecutor().isShutdown()) {
        AppExecutors.getTaskPoolExecutor().shutdownNow();
      }

      if (!AppExecutors.getScheduledExecutor().isShutdown()) {
        AppExecutors.getScheduledExecutor().shutdownNow();
      }

      logger.error("catch exception when destroyed DefaultContextListener.");
      e.printStackTrace();
    } finally {
      // 关闭阿里云服务客户端
      SystemConfig.getOtsTagClient().shutdown();
      SystemConfig.getOtsSharedClient().shutdown();
      SystemConfig.shutDownOSSClient();
      SystemConfig.closeMnsClient();
      RedisPool.closeAll();
      RedisLogAppender.closeAll();

      WechatBasicHelper.destroy();
      JerseyClientManager.destroy();
    }
  }