Skip to content

Commit 4eb2d24

Browse files
authored
Merge pull request #25 from lexiLiu/1.0.0.7
[fix]
2 parents 41663a1 + f6b8aec commit 4eb2d24

13 files changed

Lines changed: 95 additions & 45 deletions

File tree

CHANGES.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Release Notes
22

3+
## 1.0.0.7
4+
### Fix
5+
* 修复超时重试http连接未释放问题
6+
7+
### update
8+
* 移除guava依赖
9+
* 支持设置获取连接池中http连接超时时间
10+
311
## 1.0.0.6
412
### Fix
513
修复并发请求消息体异常问题

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<dependency>
2323
<groupId>com.getui.push</groupId>
2424
<artifactId>restful-sdk</artifactId>
25-
<version>1.0.0.6</version>
25+
<version>1.0.0.7</version>
2626
</dependency>
2727
```
2828

pom.xml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<groupId>com.getui.push</groupId>
88
<artifactId>restful-sdk</artifactId>
99
<packaging>jar</packaging>
10-
<version>1.0.0.6</version>
10+
<version>1.0.0.7</version>
1111
<url>https://github.com/GetuiLaboratory/getui-pushapi-java-client-v2</url>
1212
<name>Getui Push API Java Client</name>
1313
<description>Getui's officially supported Java client library for accessing Getui APIs.</description>
@@ -76,17 +76,11 @@
7676
<artifactId>gson</artifactId>
7777
<version>2.8.6</version>
7878
</dependency>
79-
<dependency>
80-
<groupId>com.google.guava</groupId>
81-
<artifactId>guava</artifactId>
82-
<version>19.0</version>
83-
<scope>test</scope>
84-
</dependency>
8579
<dependency>
8680
<groupId>junit</groupId>
8781
<artifactId>junit</artifactId>
8882
<version>4.8.2</version>
89-
<scope>test</scope>
83+
<scope>provided</scope>
9084
</dependency>
9185

9286
</dependencies>

src/main/java/com/getui/push/v2/sdk/ApiHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ public static void close(GtApiConfiguration configuration) {
6767
configuration.check();
6868
String key = configuration.keyOfCache();
6969
ApiHelper apiHelper = apiHelperCache.remove(key);
70-
apiHelper.gtApiProxyFactory.close();
70+
if (apiHelper != null) {
71+
apiHelper.gtApiProxyFactory.close();
72+
}
7173
}
7274

7375
private ApiHelper(GtApiProxyFactory gtApiProxyFactory) {

src/main/java/com/getui/push/v2/sdk/GtApiConfiguration.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,19 @@ public class GtApiConfiguration {
6161
* @see RequestConfig#getConnectTimeout()
6262
*/
6363
private int connectTimeout = 60000;
64+
/**
65+
* 从连接池中获取http连接的超时时间,单位ms
66+
*/
67+
private int connectionRequestTimeout = 0;
6468
/**
6569
* http请求失败,最大尝试次数
6670
*/
6771
private int maxHttpTryTime = 1;
6872
/**
69-
* 保持长连接的时长,默认10s,最大{@link #MAX_KEEP_ALIVE_SECONDS}
73+
* 保持长连接的时长,最大{@link #MAX_KEEP_ALIVE_SECONDS}
7074
*/
71-
private long keepAliveSeconds = 10;
72-
final long MAX_KEEP_ALIVE_SECONDS = 30;
75+
private long keepAliveSeconds = 30;
76+
final long MAX_KEEP_ALIVE_SECONDS = 20 * 60;
7377

7478
/**
7579
* http请求时是否需要信任https
@@ -180,6 +184,14 @@ public void setConnectTimeout(int connectTimeout) {
180184
this.connectTimeout = connectTimeout;
181185
}
182186

187+
public int getConnectionRequestTimeout() {
188+
return connectionRequestTimeout;
189+
}
190+
191+
public void setConnectionRequestTimeout(int connectionRequestTimeout) {
192+
this.connectionRequestTimeout = connectionRequestTimeout;
193+
}
194+
183195
public int getMaxHttpTryTime() {
184196
return maxHttpTryTime;
185197
}

src/main/java/com/getui/push/v2/sdk/common/http/GtHttpClient.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ public class GtHttpClient {
3636
private int maxHttpTryTime;
3737
CloseableHttpClient httpclient;
3838

39-
public GtHttpClient(int connectTimeout, int soTimeout, int maxHttpTryTime, long keepAliveSeconds, GtHttpProxyConfig proxyConfig, boolean trustSSL) {
39+
public GtHttpClient(int connectTimeout,
40+
int soTimeout,
41+
int connectionRequestTimeout,
42+
int maxHttpTryTime,
43+
long keepAliveSeconds,
44+
GtHttpProxyConfig proxyConfig,
45+
boolean trustSSL) {
4046
if (connectTimeout <= 0) {
4147
throw new IllegalArgumentException("connectTimeout must be > 0.");
4248
}
@@ -62,6 +68,7 @@ public GtHttpClient(int connectTimeout, int soTimeout, int maxHttpTryTime, long
6268
RequestConfig config = RequestConfig.custom()
6369
.setConnectTimeout(connectTimeout)
6470
.setSocketTimeout(soTimeout)
71+
.setConnectionRequestTimeout(connectionRequestTimeout)
6572
.setMaxRedirects(0)
6673
.build();
6774
builder.setDefaultRequestConfig(config)
@@ -124,11 +131,13 @@ private String doRequest(HttpUriRequest request, int tryTimes) {
124131
response = httpclient.execute(request);
125132
final StatusLine statusLine = response.getStatusLine();
126133
code = statusLine.getStatusCode();
134+
// toString内部回收connection
135+
String responseBody = EntityUtils.toString(response.getEntity());
127136
if (code == HttpURLConnection.HTTP_OK ||
128137
code == HttpURLConnection.HTTP_BAD_REQUEST ||
129138
code == HttpURLConnection.HTTP_UNAUTHORIZED ||
130139
code == HttpURLConnection.HTTP_FORBIDDEN) {
131-
return EntityUtils.toString(response.getEntity());
140+
return responseBody;
132141
} else if (code == HttpURLConnection.HTTP_NOT_FOUND) {
133142
throw new ApiException("not found.", code);
134143
}

src/main/java/com/getui/push/v2/sdk/common/http/HttpManager.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ public class HttpManager {
1616
private GtHttpClient client;
1717

1818
/**
19-
* @param connectionTimeOut 连接超时时间
20-
* @param readTimeout 读超时时间
21-
* @param maxHttpTryTime 失败最大尝试次数
19+
* @param connectionTimeOut 连接超时时间
20+
* @param readTimeout 读超时时间
21+
* @param connectionRequestTimeout 从连接池中获取连接的超时时间
22+
* @param maxHttpTryTime 失败最大尝试次数
2223
* @param trustSSL
2324
*/
24-
public HttpManager(int connectionTimeOut, int readTimeout, int maxHttpTryTime, long keepAliveSeconds, GtHttpProxyConfig proxyConfig, boolean trustSSL) {
25-
this.client = new GtHttpClient(connectionTimeOut, readTimeout, maxHttpTryTime, keepAliveSeconds, proxyConfig, trustSSL);
25+
public HttpManager(int connectionTimeOut, int readTimeout, int connectionRequestTimeout, int maxHttpTryTime, long keepAliveSeconds, GtHttpProxyConfig proxyConfig, boolean trustSSL) {
26+
this.client = new GtHttpClient(connectionTimeOut, readTimeout, connectionRequestTimeout, maxHttpTryTime, keepAliveSeconds, proxyConfig, trustSSL);
2627
}
2728

2829
public String syncHttps(String url, String method, Map<String, Object> headers, String body, String contentType) {

src/main/java/com/getui/push/v2/sdk/core/Configs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public interface Configs {
1313

1414
String HEADER_DOMAIN_HASH_KEY = "domainHash";
1515
String HEADER_OPEN_STABLE_DOMAIN = "openStableDomain";
16-
String SDK_VERSION = "1.0.0.6";
16+
String SDK_VERSION = "1.0.0.7";
1717
/**
1818
* 预置域名列表
1919
*/

src/main/java/com/getui/push/v2/sdk/core/client/DefaultApiClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ private DefaultApiClient(GtApiConfiguration apiConfiguration, IJson json) {
130130
this.apiConfiguration = apiConfiguration;
131131

132132
this.httpManager = new HttpManager(apiConfiguration.getConnectTimeout(),
133-
apiConfiguration.getSoTimeout(), apiConfiguration.getMaxHttpTryTime(),
134-
apiConfiguration.getKeepAliveSeconds(), apiConfiguration.getProxyConfig(),
135-
apiConfiguration.isTrustSSL());
133+
apiConfiguration.getSoTimeout(), apiConfiguration.getConnectionRequestTimeout(),
134+
apiConfiguration.getMaxHttpTryTime(), apiConfiguration.getKeepAliveSeconds(),
135+
apiConfiguration.getProxyConfig(), apiConfiguration.isTrustSSL());
136136

137137
this.hostManager = new HostManager(apiConfiguration, this.httpManager);
138138
// 分析最稳定域名

src/main/java/com/getui/push/v2/sdk/core/factory/GtApiProxyFactory.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.getui.push.v2.sdk.anno.param.GtQueryParam;
66
import com.getui.push.v2.sdk.common.ApiException;
77
import com.getui.push.v2.sdk.common.Assert;
8-
import com.getui.push.v2.sdk.common.util.Utils;
98
import com.getui.push.v2.sdk.core.client.DefaultApiClient;
109
import com.getui.push.v2.sdk.core.registry.DefaultGtApiRegistry;
1110
import com.getui.push.v2.sdk.core.registry.GtApiRegistry;
@@ -26,7 +25,7 @@
2625
*
2726
* @author getui
2827
*/
29-
public class GtApiProxyFactory implements InvocationHandler {
28+
public class GtApiProxyFactory {
3029

3130
/**
3231
* 保证一个{@link DefaultApiClient}对象对应一个{@link GtApiProxyFactory}对象
@@ -71,19 +70,25 @@ private GtApiProxyFactory(DefaultApiClient defaultApiClient) {
7170
* @return
7271
*/
7372
public <T> T createProxy(Class<T> apiService) {
74-
return (T) Proxy.newProxyInstance(apiService.getClassLoader(), new Class[]{apiService}, this);
73+
return (T) Proxy.newProxyInstance(apiService.getClassLoader(), new Class[]{apiService}, new ApiProxyHandler());
7574
}
7675

77-
@Override
78-
public Object invoke(Object proxy, Method method, Object[] args) {
79-
if ("toString".equalsIgnoreCase(method.getName()) && Utils.isEmpty(args)) {
80-
return this.toString();
76+
class ApiProxyHandler implements InvocationHandler {
77+
@Override
78+
public Object invoke(Object proxy, Method method, Object[] args) {
79+
try {
80+
if (Object.class.equals(method.getDeclaringClass())) {
81+
return method.invoke(this, args);
82+
}
83+
} catch (Throwable t) {
84+
throw new RuntimeException(t);
85+
}
86+
final BaseParam baseParam = gtApiRegistry.get(method);
87+
ApiParam apiParam = new ApiParam(baseParam);
88+
// 解析参数 -> HTTP参数
89+
handleApiParam(method, args, apiParam);
90+
return defaultApiClient.execute(apiParam);
8191
}
82-
final BaseParam baseParam = gtApiRegistry.get(method);
83-
ApiParam apiParam = new ApiParam(baseParam);
84-
// 解析参数 -> HTTP参数
85-
handleApiParam(method, args, apiParam);
86-
return defaultApiClient.execute(apiParam);
8792
}
8893

8994
/**

0 commit comments

Comments
 (0)