diff --git a/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/HttpUtils.java b/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/HttpUtils.java
index d6e18d6..c8fbc0f 100644
--- a/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/HttpUtils.java
+++ b/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/HttpUtils.java
@@ -38,8 +38,10 @@
     private static final int MAX_CONNECTIONS = 200;
     private static final int MAX_CONNECTIONS_PER_ROUTE = 20;
 
-    private static final HttpClient HTTP_CLIENT = HttpClientBuilder.create().setMaxConnTotal(MAX_CONNECTIONS)
-            .setMaxConnPerRoute(MAX_CONNECTIONS_PER_ROUTE).build();
+    private static final HttpClient HTTP_CLIENT = HttpClientBuilder.create()
+        .setMaxConnTotal(MAX_CONNECTIONS)
+        .setMaxConnPerRoute(MAX_CONNECTIONS_PER_ROUTE)
+        .build();
 
     /**
      * Execute http response.
diff --git a/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/PoaUtil.java b/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/PoaUtil.java
index 41f44d6..18ae8bc 100644
--- a/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/PoaUtil.java
+++ b/thirdparty-agent/thirdparty-poa/src/main/java/com/supwisdom/institute/backend/thirdparty/poa/PoaUtil.java
@@ -28,9 +28,13 @@
   public static void main(String[] args) {
     
     PoaUtil.poaServerUrl = "https://poa.supwisdom.com";
-    PoaUtil.clientId = "nV8US9uAdFQ0ovuYpFOloXtFkME=";
-    PoaUtil.clientSecret = "dDgZAzuNnOjfsbm8iDohyVCXBU1GwImeMsmkJzjyGh8=";
-    PoaUtil.scope = "user:v1:readUser,user:v1:readOrganization,user:v1:readGroup,user:v1:readLabel,authz:v1:readRole";
+//    PoaUtil.clientId = "nV8US9uAdFQ0ovuYpFOloXtFkME=";
+//    PoaUtil.clientSecret = "dDgZAzuNnOjfsbm8iDohyVCXBU1GwImeMsmkJzjyGh8=";
+//    PoaUtil.scope = "user:v1:readUser,user:v1:readOrganization,user:v1:readGroup,user:v1:readLabel,authz:v1:readRole";
+    
+    PoaUtil.clientId = "RYMmw6ViBOKN0YXyDOtuUc3KHtU=";
+    PoaUtil.clientSecret = "LLIkEPSzQO5ayjc_rRzdaWG87sz4ofkJwK9UtmAzv1U=";
+    PoaUtil.scope = "user:v1:readUser,user:v1:readOrganization,user:v1:readGroup,user:v1:readLabel";
     
     //JSONObject accessTokenObject = PoaUtil.getAccessToken("https://poa.supwisdom.com", "tikgr8E6vfcGDXVSG5Vs-00XJoQ=", "wZugRIydkt9lQqJyi7lco-x8wZyyreb41WC_ioj8g-I=", "personalSecurityCenterSa:v1:admin");
     JSONObject accessTokenObject = PoaUtil.getAccessTokenObject();
@@ -39,12 +43,22 @@
     String accessToken = accessTokenObject.getString("access_token");
     PoaUtil.accessToken = accessToken;
     
-    JSONObject jsonObject = PoaUtil.loadUserInfoByAccountName("https://poa.supwisdom.com/apis/user/v1", "smartadmin");
-    System.out.println(jsonObject.toJSONString());
+    for(int i=0;i<100;i++) {
+      new Thread(new Runnable() {
+
+        @Override
+        public void run() {
+          JSONObject jsonObject = PoaUtil.loadUserInfoByAccountName("https://poa.supwisdom.com/apis/user/v1", "smartadmin");
+          System.out.println(":::"+jsonObject.toJSONString());
+        }
+        
+      }).start();;
+      
+      
+    }
   }
   
   
-
   @Autowired(required = false)
   private DistributedLockHandler distributedLockHandler;
   
@@ -198,8 +212,10 @@
 
     int retry = 0;
     while(retry < 3) {
+      
+      HttpResponse httpResponse = null;
       try{
-        HttpResponse httpResponse = HttpUtils.execute(tokenUrl, "POST", null, null, new HashMap<String, Object>(), headers, formData);
+        httpResponse = HttpUtils.execute(tokenUrl, "POST", null, null, new HashMap<String, Object>(), headers, formData);
         /**
          * {
          *   "access_token": "0loVdVN4AqPIbStZmkvtkw==",
@@ -231,6 +247,8 @@
       } catch (Exception e) {
         // 未知异常时，重试
         log.error("Get access_token by [{}] from poa excption: ", clientId, e);
+      } finally {
+        HttpUtils.close(httpResponse);
       }
 
     }
@@ -279,14 +297,19 @@
     headers.put(HttpHeaders.AUTHORIZATION, "Bearer "+PoaUtil.getAccessToken());
     log.debug("{}", headers);
     
-    HttpResponse httpResponse = HttpUtils.execute(url, "GET", parameters, headers);
-    
-    JSONObject resultJsonObject = parseJSONObject(httpResponse);
-    if (resultJsonObject != null) {
-      if (!resultJsonObject.containsKey("error")) {
-        // XXX: 根据API响应数据，须修改为 只返回实际的 data 数据
-        return resultJsonObject;
+    HttpResponse httpResponse = null;
+    try {
+      httpResponse = HttpUtils.execute(url, "GET", parameters, headers);
+      
+      JSONObject resultJsonObject = parseJSONObject(httpResponse);
+      if (resultJsonObject != null) {
+        if (!resultJsonObject.containsKey("error")) {
+          // XXX: 根据API响应数据，须修改为 只返回实际的 data 数据
+          return resultJsonObject;
+        }
       }
+    } finally {
+      HttpUtils.close(httpResponse);
     }
     
     return null;
@@ -305,14 +328,19 @@
     headers.put(HttpHeaders.AUTHORIZATION, "Bearer "+PoaUtil.getAccessToken());
     log.debug("{}", headers);
     
-    HttpResponse httpResponse = HttpUtils.execute(url, "GET", parameters, headers);
+    HttpResponse httpResponse = null;
+    try {
+      httpResponse = HttpUtils.execute(url, "GET", parameters, headers);
     
-    JSONObject resultJsonObject = parseJSONObject(httpResponse);
-    if (resultJsonObject != null) {
-      if (!resultJsonObject.containsKey("error")) {
-        // XXX: 根据API响应数据，须修改为 只返回实际的 data 数据
-        return resultJsonObject;
+      JSONObject resultJsonObject = parseJSONObject(httpResponse);
+      if (resultJsonObject != null) {
+        if (!resultJsonObject.containsKey("error")) {
+          // XXX: 根据API响应数据，须修改为 只返回实际的 data 数据
+          return resultJsonObject;
+        }
       }
+    } finally {
+      HttpUtils.close(httpResponse);
     }
     
     return null;
