25
25
26
26
import java .io .IOException ;
27
27
import java .util .concurrent .TimeUnit ;
28
+ import java .util .concurrent .atomic .AtomicBoolean ;
28
29
29
30
/**
30
31
* httpclient 连接管理器
32
+ *
31
33
* @author kakotor
32
34
*/
33
35
@ NotThreadSafe
34
36
public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
35
37
protected final Logger log = LoggerFactory .getLogger (DefaultApacheHttpClientBuilder .class );
38
+ private final AtomicBoolean prepared = new AtomicBoolean (false );
36
39
private int connectionRequestTimeout = 3000 ;
37
40
private int connectionTimeout = 5000 ;
38
41
private int soTimeout = 5000 ;
@@ -49,21 +52,17 @@ public boolean retryRequest(IOException exception, int executionCount, HttpConte
49
52
};
50
53
private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory .getSocketFactory ();
51
54
private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory .getSocketFactory ();
52
-
53
55
private String httpProxyHost ;
54
56
private int httpProxyPort ;
55
57
private String httpProxyUsername ;
56
58
private String httpProxyPassword ;
57
-
58
59
/**
59
60
* 闲置连接监控线程
60
61
*/
61
62
private IdleConnectionMonitorThread idleConnectionMonitorThread ;
62
-
63
63
private HttpClientBuilder httpClientBuilder ;
64
64
65
65
private DefaultApacheHttpClientBuilder () {
66
- prepare ();
67
66
}
68
67
69
68
public static DefaultApacheHttpClientBuilder get () {
@@ -106,6 +105,7 @@ public ApacheHttpClientBuilder sslConnectionSocketFactory(SSLConnectionSocketFac
106
105
* 设置为零时不超时,一直等待.
107
106
* 设置为负数是使用系统默认设置(非上述的3000ms的默认值,而是httpclient的默认设置).
108
107
* </p>
108
+ *
109
109
* @param connectionRequestTimeout 获取链接的超时时间设置(单位毫秒),默认3000ms
110
110
*/
111
111
public void setConnectionRequestTimeout (int connectionRequestTimeout ) {
@@ -118,6 +118,7 @@ public void setConnectionRequestTimeout(int connectionRequestTimeout) {
118
118
* 设置为零时不超时,一直等待.
119
119
* 设置为负数是使用系统默认设置(非上述的5000ms的默认值,而是httpclient的默认设置).
120
120
* </p>
121
+ *
121
122
* @param connectionTimeout 建立链接的超时时间设置(单位毫秒),默认5000ms
122
123
*/
123
124
public void setConnectionTimeout (int connectionTimeout ) {
@@ -126,8 +127,9 @@ public void setConnectionTimeout(int connectionTimeout) {
126
127
127
128
/**
128
129
* 默认NIO的socket超时设置,默认5000ms.
129
- * @see java.net.SocketOptions#SO_TIMEOUT
130
+ *
130
131
* @param soTimeout 默认NIO的socket超时设置,默认5000ms.
132
+ * @see java.net.SocketOptions#SO_TIMEOUT
131
133
*/
132
134
public void setSoTimeout (int soTimeout ) {
133
135
this .soTimeout = soTimeout ;
@@ -138,6 +140,7 @@ public void setSoTimeout(int soTimeout) {
138
140
* <p>
139
141
* 超时的链接将在下一次空闲链接检查是被销毁
140
142
* </p>
143
+ *
141
144
* @param idleConnTimeout 空闲链接的超时时间,默认60000ms.
142
145
*/
143
146
public void setIdleConnTimeout (int idleConnTimeout ) {
@@ -146,6 +149,7 @@ public void setIdleConnTimeout(int idleConnTimeout) {
146
149
147
150
/**
148
151
* 检查空间链接的间隔周期,默认60000ms.
152
+ *
149
153
* @param checkWaitTime 检查空间链接的间隔周期,默认60000ms.
150
154
*/
151
155
public void setCheckWaitTime (int checkWaitTime ) {
@@ -154,6 +158,7 @@ public void setCheckWaitTime(int checkWaitTime) {
154
158
155
159
/**
156
160
* 每路的最大链接数,默认10
161
+ *
157
162
* @param maxConnPerHost 每路的最大链接数,默认10
158
163
*/
159
164
public void setMaxConnPerHost (int maxConnPerHost ) {
@@ -162,6 +167,7 @@ public void setMaxConnPerHost(int maxConnPerHost) {
162
167
163
168
/**
164
169
* 最大总连接数,默认50
170
+ *
165
171
* @param maxTotalConn 最大总连接数,默认50
166
172
*/
167
173
public void setMaxTotalConn (int maxTotalConn ) {
@@ -170,6 +176,7 @@ public void setMaxTotalConn(int maxTotalConn) {
170
176
171
177
/**
172
178
* 自定义httpclient的User Agent
179
+ *
173
180
* @param userAgent User Agent
174
181
*/
175
182
public void setUserAgent (String userAgent ) {
@@ -180,7 +187,10 @@ public IdleConnectionMonitorThread getIdleConnectionMonitorThread() {
180
187
return this .idleConnectionMonitorThread ;
181
188
}
182
189
183
- private void prepare () {
190
+ private synchronized void prepare () {
191
+ if (prepared .get ()){
192
+ return ;
193
+ }
184
194
Registry <ConnectionSocketFactory > registry = RegistryBuilder .<ConnectionSocketFactory >create ()
185
195
.register ("http" , this .plainConnectionSocketFactory )
186
196
.register ("https" , this .sslConnectionSocketFactory )
@@ -227,11 +237,14 @@ private void prepare() {
227
237
if (StringUtils .isNotBlank (this .userAgent )) {
228
238
this .httpClientBuilder .setUserAgent (this .userAgent );
229
239
}
230
-
240
+ prepared . set ( true );
231
241
}
232
242
233
243
@ Override
234
244
public CloseableHttpClient build () {
245
+ if (!prepared .get ()){
246
+ prepare ();
247
+ }
235
248
return this .httpClientBuilder .build ();
236
249
}
237
250
0 commit comments