Просмотр исходного кода

DefaultApacheHttpClientBuilder修改为单例模式 (#310)

master
kakotor 7 лет назад
committed by Binary Wang
Родитель
Сommit
baf53dc0f8
2 измененных файлов: 81 добавлений и 6 удалений
  1. +17
    -6
      weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java
  2. +64
    -0
      weixin-java-common/src/test/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilderTest.java

+ 17
- 6
weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilder.java Просмотреть файл

@@ -68,13 +68,16 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
* 闲置连接监控线程
*/
private IdleConnectionMonitorThread idleConnectionMonitorThread;
private HttpClientBuilder httpClientBuilder;
/**
* 持有client对象,仅初始化一次,避免多service实例的时候造成重复初始化的问题
*/
private CloseableHttpClient closeableHttpClient;

private DefaultApacheHttpClientBuilder() {
}

public static DefaultApacheHttpClientBuilder get() {
return new DefaultApacheHttpClientBuilder();
return DefaultApacheHttpClientBuilder.SingletonHolder.INSTANCE;
}

@Override
@@ -219,7 +222,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
this.idleConnectionMonitorThread.setDaemon(true);
this.idleConnectionMonitorThread.start();

this.httpClientBuilder = HttpClients.custom()
HttpClientBuilder httpClientBuilder = HttpClients.custom()
.setConnectionManager(connectionManager)
.setConnectionManagerShared(true)
.setSSLSocketFactory(this.buildSSLConnectionSocketFactory())
@@ -240,12 +243,13 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
new AuthScope(this.httpProxyHost, this.httpProxyPort),
new UsernamePasswordCredentials(this.httpProxyUsername,
this.httpProxyPassword));
this.httpClientBuilder.setDefaultCredentialsProvider(provider);
httpClientBuilder.setDefaultCredentialsProvider(provider);
}

if (StringUtils.isNotBlank(this.userAgent)) {
this.httpClientBuilder.setUserAgent(this.userAgent);
httpClientBuilder.setUserAgent(this.userAgent);
}
this.closeableHttpClient = httpClientBuilder.build();
prepared.set(true);
}

@@ -277,7 +281,14 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
if (!prepared.get()) {
prepare();
}
return this.httpClientBuilder.build();
return this.closeableHttpClient;
}

/**
* DefaultApacheHttpClientBuilder 改为单例模式,并持有唯一的CloseableHttpClient(仅首次调用创建)
*/
private static class SingletonHolder {
private static final DefaultApacheHttpClientBuilder INSTANCE = new DefaultApacheHttpClientBuilder();
}

public static class IdleConnectionMonitorThread extends Thread {


+ 64
- 0
weixin-java-common/src/test/java/me/chanjar/weixin/common/util/http/apache/DefaultApacheHttpClientBuilderTest.java Просмотреть файл

@@ -0,0 +1,64 @@
package me.chanjar.weixin.common.util.http.apache;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DefaultApacheHttpClientBuilderTest {
@Test
public void testBuild() throws Exception {
DefaultApacheHttpClientBuilder builder1 = DefaultApacheHttpClientBuilder.get();
DefaultApacheHttpClientBuilder builder2 = DefaultApacheHttpClientBuilder.get();
Assert.assertSame(builder1, builder2, "DefaultApacheHttpClientBuilder为单例,获取到的对象应该相同");
List<TestThread> threadList = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
TestThread thread = new TestThread();
thread.start();
threadList.add(thread);
}
for (TestThread testThread : threadList) {
testThread.join();
Assert.assertNotEquals(-1,testThread.getRespState(),"请求响应code不应为-1");
}

for (int i = 1; i < threadList.size(); i++) {
TestThread thread1 = threadList.get(i - 1);
TestThread thread2 = threadList.get(i);
Assert.assertSame(
thread1.getClient(),
thread2.getClient(),
"DefaultApacheHttpClientBuilder为单例,并持有了相同的HttpClient"
);
}
}


public static class TestThread extends Thread {
private CloseableHttpClient client;
private int respState = -1;

@Override
public void run() {
client = DefaultApacheHttpClientBuilder.get().build();
HttpGet httpGet = new HttpGet("http://www.sina.com.cn/");
try (CloseableHttpResponse resp = client.execute(httpGet)){
respState = resp.getStatusLine().getStatusCode();
} catch (IOException ignored) {
}
}

public CloseableHttpClient getClient() {
return client;
}

public int getRespState() {
return respState;
}
}
}

Загрузка…
Отмена
Сохранить