mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-11-01 03:25:35 +08:00 
			
		
		
		
	DefaultApacheHttpClientBuilder修改为单例模式 (#310)
This commit is contained in:
		| @ -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 { | ||||
|  | ||||
| @ -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; | ||||
|     } | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 kakotor
					kakotor