Skip to content

Commit 8b1aabf

Browse files
author
jeffreykzli
committed
user define dnsResolver & timeout ThreadPoolExecutor
1 parent 132b91b commit 8b1aabf

File tree

5 files changed

+68
-23
lines changed

5 files changed

+68
-23
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.qcloud</groupId>
66
<artifactId>cos_api</artifactId>
7-
<version>5.6.220.2</version>
7+
<version>5.6.224</version>
88
<packaging>jar</packaging>
99
<name>cos-java-sdk</name>
1010
<description>java sdk for qcloud cos</description>

src/main/java/com/qcloud/cos/ClientConfig.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ public class ClientConfig {
9595
private int readLimit = DEFAULT_READ_LIMIT;
9696
private COSSigner cosSigner = new COSSigner();
9797

98-
private int request_timeout = DEFAULT_REQUEST_TIMEOUT;
99-
private int shutdown_timeout = DEFAULT_SHUTDOWN_TIMEOUT;
98+
private int requestTimeout = DEFAULT_REQUEST_TIMEOUT;
99+
private int shutdownTimeout = DEFAULT_SHUTDOWN_TIMEOUT;
100100
private boolean isRequestTimeOutEnable = false;
101101

102102
// 数据万象特殊请求配置
@@ -113,12 +113,14 @@ public class ClientConfig {
113113

114114
private boolean isCheckRequestPath = true;
115115

116-
private int timeout_client_thread_size = 0;
116+
private int timeoutClientThreadSize = 0;
117117

118-
private int error_log_status_code_thresh = 500;
118+
private int errorLogStatusCodeThresh = 500;
119119

120120
private boolean checkSSLCertificate = true;
121121

122+
private boolean useDefaultDnsResolver = true;
123+
122124
// 不传入region 用于后续调用List Buckets(获取所有的bucket信息)
123125
public ClientConfig() {
124126
super();
@@ -349,11 +351,11 @@ public boolean isShortConnection() {
349351
}
350352

351353
public int getRequestTimeout () {
352-
return request_timeout;
354+
return requestTimeout;
353355
}
354356

355357
public void setRequestTimeout (int requestTimeout) {
356-
this.request_timeout = requestTimeout;
358+
this.requestTimeout = requestTimeout;
357359
}
358360

359361
public void setRequestTimeOutEnable(boolean requestTimeOutEnable) {
@@ -365,11 +367,11 @@ public boolean getRequestTimeOutEnable() {
365367
}
366368

367369
public void setShutdownTimeout(int shutdownTimeout) {
368-
this.shutdown_timeout = shutdownTimeout;
370+
this.shutdownTimeout = shutdownTimeout;
369371
}
370372

371373
public int getShutdownTimeout() {
372-
return shutdown_timeout;
374+
return shutdownTimeout;
373375
}
374376

375377
public boolean isChangeEndpointRetry() {
@@ -397,19 +399,19 @@ public boolean isCheckRequestPath() {
397399
}
398400

399401
public int getTimeoutClientThreadSize() {
400-
return timeout_client_thread_size;
402+
return timeoutClientThreadSize;
401403
}
402404

403-
public void setTimeoutClientThreadSize(int pool_size) {
404-
timeout_client_thread_size = pool_size;
405+
public void setTimeoutClientThreadSize(int poolSize) {
406+
timeoutClientThreadSize = poolSize;
405407
}
406408

407-
public void setErrorLogStatusCodeThresh(int status_code) {
408-
error_log_status_code_thresh = status_code;
409+
public void setErrorLogStatusCodeThresh(int statusCode) {
410+
errorLogStatusCodeThresh = statusCode;
409411
}
410412

411413
public int getErrorLogStatusCodeThresh() {
412-
return error_log_status_code_thresh;
414+
return errorLogStatusCodeThresh;
413415
}
414416

415417
public void setCheckSSLCertificate(boolean isCheckSSLCertificate) {
@@ -419,4 +421,12 @@ public void setCheckSSLCertificate(boolean isCheckSSLCertificate) {
419421
public boolean isCheckSSLCertificate() {
420422
return checkSSLCertificate;
421423
}
424+
425+
public void setUseDefaultDnsResolver(boolean useDefaultDnsResolver) {
426+
this.useDefaultDnsResolver = useDefaultDnsResolver;
427+
}
428+
429+
public boolean isUseDefaultDnsResolver() {
430+
return useDefaultDnsResolver;
431+
}
422432
}

src/main/java/com/qcloud/cos/http/DefaultCosHttpClient.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,16 @@
2323
import java.io.FileInputStream;
2424
import java.io.IOException;
2525
import java.io.InputStream;
26+
import java.net.InetAddress;
2627
import java.net.URI;
2728
import java.net.URISyntaxException;
29+
import java.net.UnknownHostException;
2830
import java.security.NoSuchAlgorithmException;
2931
import java.security.KeyManagementException;
3032
import java.security.KeyStoreException;
33+
import java.util.Arrays;
34+
import java.util.ArrayList;
35+
import java.util.Collections;
3136
import java.util.Date;
3237
import java.util.Objects;
3338
import java.util.HashMap;
@@ -85,6 +90,7 @@
8590
import org.apache.http.client.protocol.HttpClientContext;
8691
import org.apache.http.config.Registry;
8792
import org.apache.http.config.RegistryBuilder;
93+
import org.apache.http.conn.DnsResolver;
8894
import org.apache.http.conn.socket.ConnectionSocketFactory;
8995
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
9096
import org.apache.http.conn.ssl.NoopHostnameVerifier;
@@ -118,9 +124,27 @@ public DefaultCosHttpClient(ClientConfig clientConfig) {
118124
super();
119125
this.errorResponseHandler = new CosErrorResponseHandler();
120126
this.clientConfig = clientConfig;
127+
DnsResolver dnsResolver = new DnsResolver() {
128+
@Override
129+
public InetAddress[] resolve(String host) throws UnknownHostException {
130+
InetAddress[] addresses = InetAddress.getAllByName(host);
131+
List<InetAddress> addressList = new ArrayList<>(Arrays.asList(addresses));
132+
Collections.shuffle(addressList);
133+
134+
InetAddress[] newAddresses = addressList.toArray(new InetAddress[0]);
135+
return newAddresses;
136+
}
137+
};
121138

122139
if (clientConfig.isCheckSSLCertificate()) {
123-
this.connectionManager = new PoolingHttpClientConnectionManager();
140+
if (clientConfig.isUseDefaultDnsResolver()) {
141+
this.connectionManager = new PoolingHttpClientConnectionManager();
142+
} else {
143+
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
144+
.register("http", PlainConnectionSocketFactory.getSocketFactory())
145+
.register("https", SSLConnectionSocketFactory.getSocketFactory()).build();
146+
this.connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, dnsResolver);
147+
}
124148
} else {
125149
try {
126150
SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial((chain, authType) -> true).build();
@@ -129,7 +153,11 @@ public DefaultCosHttpClient(ClientConfig clientConfig) {
129153
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
130154
.register("http", PlainConnectionSocketFactory.getSocketFactory())
131155
.register("https", sslSocketFactory).build();
132-
this.connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
156+
if (clientConfig.isUseDefaultDnsResolver()) {
157+
this.connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
158+
} else {
159+
this.connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, dnsResolver);
160+
}
133161
} catch (NoSuchAlgorithmException e) {
134162
log.error("fail to init http client: ", e);
135163
throw new RuntimeException(e);

src/main/java/com/qcloud/cos/http/IdleConnectionMonitorThread.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public void run() {
5454
}
5555
} catch (InterruptedException e) {
5656
log.error("interrupt exception occured:", e);
57+
} catch (Throwable t) {
58+
log.error("error occured when closeExpiredConnections and closeIdleConnections, err:", t);
5759
} finally {
5860
connMgr.shutdown();
5961
}

src/main/java/com/qcloud/cos/http/TimeOutCosHttpClient.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,28 @@
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
99

10-
import java.util.concurrent.ExecutorService;
10+
import java.util.concurrent.ArrayBlockingQueue;
1111
import java.util.concurrent.Executors;
1212
import java.util.concurrent.Future;
1313
import java.util.concurrent.TimeUnit;
14+
import java.util.concurrent.ThreadPoolExecutor;
1415
import java.util.concurrent.Callable;
1516

1617
public class TimeOutCosHttpClient extends DefaultCosHttpClient{
17-
private ExecutorService threadPool;
18+
private ThreadPoolExecutor threadPool;
1819
private static final Logger log = LoggerFactory.getLogger(TimeOutCosHttpClient.class);
1920

2021
public TimeOutCosHttpClient(ClientConfig clientConfig) {
2122
super(clientConfig);
22-
int pool_size = clientConfig.getTimeoutClientThreadSize();
23-
if (pool_size <= 0) {
24-
pool_size = Runtime.getRuntime().availableProcessors() * 5;
23+
int poolSize = clientConfig.getTimeoutClientThreadSize();
24+
if (poolSize <= 0) {
25+
poolSize = Runtime.getRuntime().availableProcessors() * 5;
2526
}
26-
threadPool = Executors.newFixedThreadPool(pool_size);
27+
28+
threadPool = new ThreadPoolExecutor(poolSize, poolSize * 2, 60L, TimeUnit.SECONDS,
29+
new ArrayBlockingQueue<Runnable>(poolSize * 20), Executors.defaultThreadFactory(),
30+
new ThreadPoolExecutor.CallerRunsPolicy());
31+
threadPool.allowCoreThreadTimeOut(true);
2732
}
2833

2934
@Override

0 commit comments

Comments
 (0)