mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 02:28:25 +08:00 
			
		
		
		
	DefaultApacheHttpClientBuilder修改为单例模式 (#310)
This commit is contained in:
		| @ -68,13 +68,16 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { | |||||||
|    * 闲置连接监控线程 |    * 闲置连接监控线程 | ||||||
|    */ |    */ | ||||||
|   private IdleConnectionMonitorThread idleConnectionMonitorThread; |   private IdleConnectionMonitorThread idleConnectionMonitorThread; | ||||||
|   private HttpClientBuilder httpClientBuilder; |   /** | ||||||
|  |    * 持有client对象,仅初始化一次,避免多service实例的时候造成重复初始化的问题 | ||||||
|  |    */ | ||||||
|  |   private CloseableHttpClient closeableHttpClient; | ||||||
|  |  | ||||||
|   private DefaultApacheHttpClientBuilder() { |   private DefaultApacheHttpClientBuilder() { | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public static DefaultApacheHttpClientBuilder get() { |   public static DefaultApacheHttpClientBuilder get() { | ||||||
|     return new DefaultApacheHttpClientBuilder(); |     return DefaultApacheHttpClientBuilder.SingletonHolder.INSTANCE; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
| @ -219,7 +222,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { | |||||||
|     this.idleConnectionMonitorThread.setDaemon(true); |     this.idleConnectionMonitorThread.setDaemon(true); | ||||||
|     this.idleConnectionMonitorThread.start(); |     this.idleConnectionMonitorThread.start(); | ||||||
|  |  | ||||||
|     this.httpClientBuilder = HttpClients.custom() |     HttpClientBuilder httpClientBuilder = HttpClients.custom() | ||||||
|       .setConnectionManager(connectionManager) |       .setConnectionManager(connectionManager) | ||||||
|       .setConnectionManagerShared(true) |       .setConnectionManagerShared(true) | ||||||
|       .setSSLSocketFactory(this.buildSSLConnectionSocketFactory()) |       .setSSLSocketFactory(this.buildSSLConnectionSocketFactory()) | ||||||
| @ -240,12 +243,13 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { | |||||||
|         new AuthScope(this.httpProxyHost, this.httpProxyPort), |         new AuthScope(this.httpProxyHost, this.httpProxyPort), | ||||||
|         new UsernamePasswordCredentials(this.httpProxyUsername, |         new UsernamePasswordCredentials(this.httpProxyUsername, | ||||||
|           this.httpProxyPassword)); |           this.httpProxyPassword)); | ||||||
|       this.httpClientBuilder.setDefaultCredentialsProvider(provider); |       httpClientBuilder.setDefaultCredentialsProvider(provider); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (StringUtils.isNotBlank(this.userAgent)) { |     if (StringUtils.isNotBlank(this.userAgent)) { | ||||||
|       this.httpClientBuilder.setUserAgent(this.userAgent); |       httpClientBuilder.setUserAgent(this.userAgent); | ||||||
|     } |     } | ||||||
|  |     this.closeableHttpClient = httpClientBuilder.build(); | ||||||
|     prepared.set(true); |     prepared.set(true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -277,7 +281,14 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { | |||||||
|     if (!prepared.get()) { |     if (!prepared.get()) { | ||||||
|       prepare(); |       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 { |   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