diff --git a/build.gradle b/build.gradle index 3a21c62..cb06d61 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ uploadArchives { authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) } pom.project { - version '1.1.112' + version '1.1.114' artifactId ARTIFACT_Id groupId GROUP_ID packaging TYPE diff --git a/src/main/java/com/taover/util/UtilHttpByOkHttp.java b/src/main/java/com/taover/util/UtilHttpByOkHttp.java index dcde5bc..4976f8c 100644 --- a/src/main/java/com/taover/util/UtilHttpByOkHttp.java +++ b/src/main/java/com/taover/util/UtilHttpByOkHttp.java @@ -24,8 +24,7 @@ import okhttp3.ResponseBody; public class UtilHttpByOkHttp { //防止线程并发,使用threadlocal管理client - private static ThreadLocal localHttpClientForHttp = new ThreadLocal(); - private static ThreadLocal localHttpClientForHttps = new ThreadLocal(); + private static Map localHttpClient = new HashMap(); public static final String METHOD_GET = "GET"; public static final String METHOD_POST = "POST"; @@ -131,38 +130,38 @@ public class UtilHttpByOkHttp { } public static OkHttpClient getHttpClient(String url, int timeoutInSecond){ - OkHttpClient client = null; + OkHttpClient client = null; boolean isHttps = url.trim().toLowerCase().startsWith("https"); - if(isHttps){ - client = localHttpClientForHttps.get(); - }else{ - client = localHttpClientForHttp.get(); - } - - if(client != null){ - return client; - } - - if(isHttps){ - client = buildOkHttpClientForHttps(timeoutInSecond); - }else{ - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.connectTimeout(timeoutInSecond, TimeUnit.SECONDS) - .readTimeout(timeoutInSecond, TimeUnit.SECONDS) - .writeTimeout(timeoutInSecond,TimeUnit.SECONDS) - .retryOnConnectionFailure(true); - client = builder.build(); - } - - if(isHttps){ - localHttpClientForHttps.set(client); - }else{ - localHttpClientForHttp.set(client); - } - + String mapKey = getHttpClientMapKey(isHttps, timeoutInSecond); + synchronized (localHttpClient) { + client = localHttpClient.get(mapKey); + if(client != null){ + return client; + } + + if(isHttps){ + client = buildOkHttpClientForHttps(timeoutInSecond); + }else{ + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.connectTimeout(timeoutInSecond, TimeUnit.SECONDS) + .readTimeout(timeoutInSecond, TimeUnit.SECONDS) + .writeTimeout(timeoutInSecond,TimeUnit.SECONDS) + .retryOnConnectionFailure(true); + client = builder.build(); + } + localHttpClient.put(mapKey, client); + } return client; } + private static String getHttpClientMapKey(boolean isHttps, int timeoutInSecond) { + if(isHttps) { + return "HTTPS_"+timeoutInSecond; + }else { + return "HTTP_"+timeoutInSecond; + } + } + /** * 并发请求复用连接池,避免内存溢出 * @param okHttpClient diff --git a/src/test/java/OkHttpDebug.java b/src/test/java/OkHttpDebug.java index 0d5deea..264e72b 100644 --- a/src/test/java/OkHttpDebug.java +++ b/src/test/java/OkHttpDebug.java @@ -1,4 +1,77 @@ +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import com.taover.util.UtilHttpByOkHttp; public class OkHttpDebug { + public static void main(String args[]) { + //loadRequestPerMinute(10); + + //testWarePushOrder(100); + + multiRequest(10); + } + + private static void multiRequest(int count) { + for(int sequence=0; sequence params = new HashMap(); + for(int i=0; i