2525
2626import java .io .IOException ;
2727import java .util .concurrent .TimeUnit ;
28+ import java .util .concurrent .atomic .AtomicBoolean ;
2829
2930/**
3031 * httpclient 连接管理器
32+ *
3133 * @author kakotor
3234 */
3335@ NotThreadSafe
3436public 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