Skip to content

Commit 3d013c1

Browse files
author
ben
committed
修复将prepare方法移动到构造方法中导致代理配置设置无效的问题,将prepare方法改为同步执行,防止被多次调用.
1 parent 5d63b1e commit 3d013c1

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@
2525

2626
import java.io.IOException;
2727
import java.util.concurrent.TimeUnit;
28+
import java.util.concurrent.atomic.AtomicBoolean;
2829

2930
/**
3031
* httpclient 连接管理器
32+
*
3133
* @author kakotor
3234
*/
3335
@NotThreadSafe
3436
public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
3537
protected final Logger log = LoggerFactory.getLogger(DefaultApacheHttpClientBuilder.class);
38+
private final AtomicBoolean prepared = new AtomicBoolean(false);
3639
private int connectionRequestTimeout = 3000;
3740
private int connectionTimeout = 5000;
3841
private int soTimeout = 5000;
@@ -49,21 +52,17 @@ public boolean retryRequest(IOException exception, int executionCount, HttpConte
4952
};
5053
private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
5154
private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
52-
5355
private String httpProxyHost;
5456
private int httpProxyPort;
5557
private String httpProxyUsername;
5658
private String httpProxyPassword;
57-
5859
/**
5960
* 闲置连接监控线程
6061
*/
6162
private IdleConnectionMonitorThread idleConnectionMonitorThread;
62-
6363
private HttpClientBuilder httpClientBuilder;
6464

6565
private DefaultApacheHttpClientBuilder() {
66-
prepare();
6766
}
6867

6968
public static DefaultApacheHttpClientBuilder get() {
@@ -106,6 +105,7 @@ public ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFac
106105
* 设置为零时不超时,一直等待.
107106
* 设置为负数是使用系统默认设置(非上述的3000ms的默认值,而是httpclient的默认设置).
108107
* </p>
108+
*
109109
* @param connectionRequestTimeout 获取链接的超时时间设置(单位毫秒),默认3000ms
110110
*/
111111
public void setConnectionRequestTimeout(int connectionRequestTimeout) {
@@ -118,6 +118,7 @@ public void setConnectionRequestTimeout(int connectionRequestTimeout) {
118118
* 设置为零时不超时,一直等待.
119119
* 设置为负数是使用系统默认设置(非上述的5000ms的默认值,而是httpclient的默认设置).
120120
* </p>
121+
*
121122
* @param connectionTimeout 建立链接的超时时间设置(单位毫秒),默认5000ms
122123
*/
123124
public void setConnectionTimeout(int connectionTimeout) {
@@ -126,8 +127,9 @@ public void setConnectionTimeout(int connectionTimeout) {
126127

127128
/**
128129
* 默认NIO的socket超时设置,默认5000ms.
129-
* @see java.net.SocketOptions#SO_TIMEOUT
130+
*
130131
* @param soTimeout 默认NIO的socket超时设置,默认5000ms.
132+
* @see java.net.SocketOptions#SO_TIMEOUT
131133
*/
132134
public void setSoTimeout(int soTimeout) {
133135
this.soTimeout = soTimeout;
@@ -138,6 +140,7 @@ public void setSoTimeout(int soTimeout) {
138140
* <p>
139141
* 超时的链接将在下一次空闲链接检查是被销毁
140142
* </p>
143+
*
141144
* @param idleConnTimeout 空闲链接的超时时间,默认60000ms.
142145
*/
143146
public void setIdleConnTimeout(int idleConnTimeout) {
@@ -146,6 +149,7 @@ public void setIdleConnTimeout(int idleConnTimeout) {
146149

147150
/**
148151
* 检查空间链接的间隔周期,默认60000ms.
152+
*
149153
* @param checkWaitTime 检查空间链接的间隔周期,默认60000ms.
150154
*/
151155
public void setCheckWaitTime(int checkWaitTime) {
@@ -154,6 +158,7 @@ public void setCheckWaitTime(int checkWaitTime) {
154158

155159
/**
156160
* 每路的最大链接数,默认10
161+
*
157162
* @param maxConnPerHost 每路的最大链接数,默认10
158163
*/
159164
public void setMaxConnPerHost(int maxConnPerHost) {
@@ -162,6 +167,7 @@ public void setMaxConnPerHost(int maxConnPerHost) {
162167

163168
/**
164169
* 最大总连接数,默认50
170+
*
165171
* @param maxTotalConn 最大总连接数,默认50
166172
*/
167173
public void setMaxTotalConn(int maxTotalConn) {
@@ -170,6 +176,7 @@ public void setMaxTotalConn(int maxTotalConn) {
170176

171177
/**
172178
* 自定义httpclient的User Agent
179+
*
173180
* @param userAgent User Agent
174181
*/
175182
public void setUserAgent(String userAgent) {
@@ -180,7 +187,10 @@ public IdleConnectionMonitorThread getIdleConnectionMonitorThread() {
180187
return this.idleConnectionMonitorThread;
181188
}
182189

183-
private void prepare() {
190+
private synchronized void prepare() {
191+
if(prepared.get()){
192+
return;
193+
}
184194
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
185195
.register("http", this.plainConnectionSocketFactory)
186196
.register("https", this.sslConnectionSocketFactory)
@@ -227,11 +237,14 @@ private void prepare() {
227237
if (StringUtils.isNotBlank(this.userAgent)) {
228238
this.httpClientBuilder.setUserAgent(this.userAgent);
229239
}
230-
240+
prepared.set(true);
231241
}
232242

233243
@Override
234244
public CloseableHttpClient build() {
245+
if(!prepared.get()){
246+
prepare();
247+
}
235248
return this.httpClientBuilder.build();
236249
}
237250

0 commit comments

Comments
 (0)