Skip to content

Commit 4009faa

Browse files
author
liuyj
committed
[update]
1. 支持jdk版本 1.8及以上版本,不再支持jdk1.6 2. 重试支持切换域名 3. 支持设置接口维度的超时时间 4. 修改默认的连接超时时间,30s改为10s 5. 内部异常,会拼接到apiResult的msg上,eg. 原来接口超时返回`{"code":5000, "message":"http error::5000"}`,修改后返回`{"code":5000, "message":"http error:Read timed out::5000"}
1 parent ffc4e00 commit 4009faa

File tree

15 files changed

+471
-93
lines changed

15 files changed

+471
-93
lines changed

CHANGES.md

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

3+
## 1.0.1.0
4+
5+
### update
6+
7+
* 支持jdk版本 1.8及以上版本,不再支持jdk1.6
8+
* 重试支持切换域名
9+
* 支持设置接口维度的超时时间
10+
* 修改默认的连接超时时间,60s改为10s
11+
* 内部异常,会拼接到apiResult的msg上,eg. 原来接口超时返回`{"code":5000, "message":"http error::5000"}`,修改后返回`{"code":5000, "message":"http error:Read timed out::5000"}
12+
313
## 1.0.0.17
414

515
### update

README.md

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
## 环境要求
10-
1. 需要配合`JDK 1.6`或其以上版本。
10+
1. 需要配合`JDK 1.8`或其以上版本。
1111

1212
2. 使用`个推PUSH SDK`前,您需要先前往[个推开发者中心](https://dev.getui.com) 完成开发者接入的一些准备工作,创建应用。详细见[操作步骤](https://docs.getui.com/getui/start/devcenter/#1)
1313

@@ -22,7 +22,7 @@
2222
<dependency>
2323
<groupId>com.getui.push</groupId>
2424
<artifactId>restful-sdk</artifactId>
25-
<version>1.0.0.17</version>
25+
<version>1.0.1.0</version>
2626
</dependency>
2727
```
2828

@@ -46,7 +46,7 @@ public class TestCreatApi {
4646
apiConfiguration.setAppId("xxx");
4747
apiConfiguration.setAppKey("xxx");
4848
apiConfiguration.setMasterSecret("xxx");
49-
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
49+
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀
5050
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
5151
// 实例化ApiHelper对象,用于创建接口对象
5252
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
@@ -56,6 +56,24 @@ public class TestCreatApi {
5656
}
5757
```
5858

59+
###### 已支持的配置项说明
60+
| 通过代码修改 | 启动项 | 默认值 | 说明 |
61+
| --- | --- | --- | --- |
62+
| gtApiConfiguration.setSoTimeout(30000); | \-Dgt.socket.timeout=30000 | 30000 | 修改全局的套接字读超时时间,默认30s,单位ms |
63+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.singleCidUri, 3000); | \-D/push/single/cid= | 默认为gt.socket.timeout的值 | cid单推接口设置套接字读取超时时间,单位ms |
64+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.singleAliasUri, 3000); | \-D/push/single/alias= | 默认为gt.socket.timeout的值 | 别名单推接口设置套接字读取超时时间,单位ms |
65+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.singleBatchCidUri, 6000); | \-D/push/single/batch/cid= | 默认为gt.socket.timeout的值 | cid批量单推接口设置套接字读取超时时间,单位ms |
66+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.singleBatchAliasUri, 6000); | \-D/push/single/batch/alias= | 默认为gt.socket.timeout的值 | 别名批量单推接口设置套接字读取超时时间,单位ms |
67+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.pushListMessageUri, 3000); | \-D/push/list/message= | 默认为gt.socket.timeout的值 | 保存列表推消息体接口设置套接字读取超时时间,单位ms |
68+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.pushListCidUri, 6000); | \-D/push/list/cid= | 默认为gt.socket.timeout的值 | cid列表推接口设置套接字读取超时时间,单位ms |
69+
| gtApiConfiguration.setCustomSocketTimeout(PushApi.pushListAliasUri, 6000); | \-D/push/list/alias= | 默认为gt.socket.timeout的值 | 别名列表推接口设置套接字读取超时时间,单位ms |
70+
| gtApiConfiguration.setConnectTimeout(10000); | \-Dgt.connect.timeout=10000 | 10000 | 修改连接超时时间,默认10s,单位ms |
71+
| gtApiConfiguration.setMaxHttpTryTime(1); | \-Dgt.max.http.try.times=1 | 1 |设置重试次数;<br>上述配置项设为1时,如果请求失败(超时或其他异常),sdk内部会重试1次,重试可能造成消息重复,建议客户配合消息幂等使用,详见文档:[消息覆盖https://docs.getui.com/getui/server/rest_v2/advanced/](https://docs.getui.com/getui/server/rest_v2/advanced/);<br>用户不接受重试的,可将此值改为0|
72+
| gtApiConfiguration.setOpenAnalyseStableDomainSwitch(true); | \-Dgt.analyse.stable.domain.switch=true | true | 是否开启稳定域名检测 |
73+
| gtApiConfiguration.setMaxFailedNum(10); | \-Dgt.max.failed.num=10 | 10 | 开启稳定域名检测时生效,单位时间内失败总次数阈值,达到阈值会切换域名 |
74+
| gtApiConfiguration.setCheckMaxFailedNumInterval(3000); | \-Dgt.check.max.failed.num.interval=3000 | 3000 | 开启稳定域名检测时生效,修改上述阈值的单位时间,单位ms |
75+
| gtApiConfiguration.setContinuousFailedNum(3); | \-Dgt.continuous.failed.num=3 | 3 | 开启稳定域名检测时生效,连续失败次数达到阈值会切换域名 |
76+
5977
##### 使用示例:**推送API**_根据cid进行单推
6078

6179
```java
@@ -176,7 +194,7 @@ public class TestUserApi {
176194
### 设置代理
177195
> 当需要使用代理进行http访问时,可以参考如下设置
178196
179-
```java
197+
```
180198
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
181199
//设置代理对象,参数依次为host、端口、鉴权账户、鉴权密码。其中鉴权账户密码可选
182200
GtHttpProxyConfig proxyConfig = new GtHttpProxyConfig("xxx",xxx,"xxx","xxx");

pom.xml

Lines changed: 4 additions & 4 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.17</version>
10+
<version>1.0.1.0</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>
@@ -80,7 +80,7 @@
8080
<groupId>junit</groupId>
8181
<artifactId>junit</artifactId>
8282
<version>4.8.2</version>
83-
<scope>provided</scope>
83+
<scope>test</scope>
8484
</dependency>
8585

8686
</dependencies>
@@ -91,8 +91,8 @@
9191
<artifactId>maven-compiler-plugin</artifactId>
9292
<version>2.3.2</version>
9393
<configuration>
94-
<source>1.6</source>
95-
<target>1.6</target>
94+
<source>1.8</source>
95+
<target>1.8</target>
9696
<encoding>utf-8</encoding>
9797
</configuration>
9898
</plugin>

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.getui.push.v2.sdk.core.DefaultJson;
88
import com.getui.push.v2.sdk.core.client.DefaultApiClient;
99
import com.getui.push.v2.sdk.core.factory.GtApiProxyFactory;
10+
import com.getui.push.v2.sdk.core.handler.GtInterceptor;
1011

1112
import java.util.Map;
1213
import java.util.concurrent.ConcurrentHashMap;
@@ -37,6 +38,14 @@ public static ApiHelper build(GtApiConfiguration configuration) {
3738
* @return
3839
*/
3940
public static ApiHelper build(GtApiConfiguration configuration, IJson json) {
41+
return build(configuration, json, null);
42+
}
43+
44+
/**
45+
* @param configuration 配置信息类
46+
* @return
47+
*/
48+
public static ApiHelper build(GtApiConfiguration configuration, IJson json, GtInterceptor interceptor) {
4049
Assert.notNull(configuration, "configuration");
4150
configuration.check();
4251
String key = configuration.keyOfCache();
@@ -53,6 +62,9 @@ public static ApiHelper build(GtApiConfiguration configuration, IJson json) {
5362
return apiHelper;
5463
}
5564
final DefaultApiClient defaultApiClient = DefaultApiClient.build(configuration, json);
65+
if (interceptor != null) {
66+
defaultApiClient.addGtInterceptor(interceptor);
67+
}
5668
GtApiProxyFactory factory = GtApiProxyFactory.build(defaultApiClient);
5769
final AuthApi authApi = factory.createProxy(AuthApi.class);
5870
defaultApiClient.setAuthApiAndAuth(authApi);

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

Lines changed: 102 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package com.getui.push.v2.sdk;
22

3+
import com.getui.push.v2.sdk.anno.method.GtDelete;
4+
import com.getui.push.v2.sdk.anno.method.GtGet;
5+
import com.getui.push.v2.sdk.anno.method.GtPost;
6+
import com.getui.push.v2.sdk.anno.method.GtPut;
7+
import com.getui.push.v2.sdk.api.PushApi;
38
import com.getui.push.v2.sdk.common.Assert;
9+
import com.getui.push.v2.sdk.core.Configs;
410
import org.apache.http.client.config.RequestConfig;
511

612
import java.util.Arrays;
713
import java.util.HashSet;
14+
import java.util.Map;
815
import java.util.Set;
16+
import java.util.concurrent.ConcurrentHashMap;
917

1018
/**
1119
* 应用相关配置信息
@@ -28,7 +36,7 @@ public class GtApiConfiguration {
2836
*/
2937
private String masterSecret;
3038
/**
31-
* 接口调用前缀, 可不包含{@link #appId}
39+
* 接口调用前缀, 不带{@link #appId}
3240
* eg. https://restapi.getui.com/v2
3341
*/
3442
private String domain = "https://restapi.getui.com/v2";
@@ -70,20 +78,23 @@ public class GtApiConfiguration {
7078
*
7179
* @see RequestConfig#getSocketTimeout()
7280
*/
81+
private final String SOCKET_TIMEOUT_KEY = "gt.socket.timeout";
7382
private int soTimeout = 30000;
7483
/**
7584
* http连接超时时间,单位ms
7685
*
7786
* @see RequestConfig#getConnectTimeout()
7887
*/
79-
private int connectTimeout = 60000;
88+
private final String CONNECT_TIMEOUT_KEY = "gt.connect.timeout";
89+
private int connectTimeout = 10000;
8090
/**
8191
* 从连接池中获取http连接的超时时间,单位ms
8292
*/
8393
private int connectionRequestTimeout = 0;
8494
/**
85-
* http请求失败,最大尝试次数
95+
* http请求失败,最大尝试次数,默认重试1次,0表示不重试
8696
*/
97+
private final String MAX_HTTP_TRY_TIME_KEY = "gt.max.http.try.times";
8798
private int maxHttpTryTime = 1;
8899
/**
89100
* 保持长连接的时长,最大{@link #MAX_KEEP_ALIVE_SECONDS}
@@ -101,6 +112,33 @@ public class GtApiConfiguration {
101112
*/
102113
private GtHttpProxyConfig proxyConfig;
103114

115+
/**
116+
* 存储uri和socketTimeout,支持设置接口维度socketTimeout
117+
*/
118+
private Map<String, Integer> uriToSocketTimeoutMap = new ConcurrentHashMap<>();
119+
/**
120+
* 最大失败次数,单位时间内达到此阈值,切换域名,默认10次
121+
*/
122+
public final static String MAX_FAILED_NUM_KEY = "gt.max.failed.num";
123+
private int maxFailedNum = 10;
124+
125+
/**
126+
* 连续失败次数达到阈值,切换域名,默认3
127+
*/
128+
public final static String CONTINUOUS_FAILED_NUM_KEY = "gt.continuous.failed.num";
129+
private int continuousFailedNum = Configs.MAX_FAIL_CONTINUOUSLY;
130+
131+
/**
132+
* 重置最大失败次数的时间间隔,默认3s
133+
*/
134+
public final static String CHECK_MAX_FAILED_NUM_INTERVAL_KEY = "gt.check.max.failed.num.interval";
135+
private long checkMaxFailedNumInterval = 3000;
136+
/**
137+
* 域名检测的超时时间,单位ms,默认100ms
138+
*/
139+
public final static String HTTP_CHECK_TIMEOUT_KEY = "gt.http.check.timeout";
140+
private int httpCheckTimeout = 100;
141+
104142
/**
105143
* @param domain 接口调用前缀, 可不含{@link #appId}
106144
*/
@@ -209,15 +247,15 @@ public void setCheckHealthInterval(long checkHealthInterval) {
209247
}
210248

211249
public int getSoTimeout() {
212-
return soTimeout;
250+
return Integer.getInteger(SOCKET_TIMEOUT_KEY, soTimeout);
213251
}
214252

215253
public void setSoTimeout(int soTimeout) {
216254
this.soTimeout = soTimeout;
217255
}
218256

219257
public int getConnectTimeout() {
220-
return connectTimeout;
258+
return Integer.getInteger(CONNECT_TIMEOUT_KEY, connectTimeout);
221259
}
222260

223261
public void setConnectTimeout(int connectTimeout) {
@@ -233,7 +271,7 @@ public void setConnectionRequestTimeout(int connectionRequestTimeout) {
233271
}
234272

235273
public int getMaxHttpTryTime() {
236-
return maxHttpTryTime;
274+
return Integer.getInteger(MAX_HTTP_TRY_TIME_KEY, maxHttpTryTime);
237275
}
238276

239277
public void setMaxHttpTryTime(int maxHttpTryTime) {
@@ -281,6 +319,38 @@ public void setProxyConfig(GtHttpProxyConfig proxyConfig) {
281319
this.proxyConfig = proxyConfig;
282320
}
283321

322+
public int getContinuousFailedNum() {
323+
return Integer.getInteger(CONTINUOUS_FAILED_NUM_KEY, continuousFailedNum);
324+
}
325+
326+
public void setContinuousFailedNum(int continuousFailedNum) {
327+
this.continuousFailedNum = continuousFailedNum;
328+
}
329+
330+
public int getMaxFailedNum() {
331+
return Integer.getInteger(MAX_FAILED_NUM_KEY, maxFailedNum);
332+
}
333+
334+
public void setMaxFailedNum(int maxFailedNum) {
335+
this.maxFailedNum = maxFailedNum;
336+
}
337+
338+
public long getCheckMaxFailedNumInterval() {
339+
return Long.getLong(CHECK_MAX_FAILED_NUM_INTERVAL_KEY, checkMaxFailedNumInterval);
340+
}
341+
342+
public void setCheckMaxFailedNumInterval(long checkMaxFailedNumInterval) {
343+
this.checkMaxFailedNumInterval = checkMaxFailedNumInterval;
344+
}
345+
346+
public int getHttpCheckTimeout() {
347+
return Integer.getInteger(HTTP_CHECK_TIMEOUT_KEY, httpCheckTimeout);
348+
}
349+
350+
public void setHttpCheckTimeout(int httpCheckTimeout) {
351+
this.httpCheckTimeout = httpCheckTimeout;
352+
}
353+
284354
@Override
285355
public boolean equals(Object o) {
286356
if (this == o) {
@@ -329,4 +399,30 @@ public String prefixOfKey() {
329399
return String.format("%s|%s", this.getAppId(), this.getAppKey());
330400
}
331401

402+
/**
403+
* 针对接口设置超时时间,可根据监控修改合理值
404+
*
405+
* @param uri {@link GtGet#uri()}, {@link GtPost#uri()}, {@link GtDelete#uri()}, {@link GtPut#uri()}
406+
* @param socketTimeout {@link RequestConfig#getSocketTimeout()},单位: ms
407+
*/
408+
public void setCustomSocketTimeout(String uri, int socketTimeout) {
409+
this.uriToSocketTimeoutMap.put(uri, socketTimeout);
410+
}
411+
412+
public void resetConnectAndSocketTimeout() {
413+
setConnectTimeout(3000);
414+
setCustomSocketTimeout(PushApi.singleCidUri, 3000);
415+
setCustomSocketTimeout(PushApi.singleAliasUri, 3000);
416+
setCustomSocketTimeout(PushApi.singleBatchCidUri, 6000);
417+
setCustomSocketTimeout(PushApi.singleBatchAliasUri, 6000);
418+
setCustomSocketTimeout(PushApi.singleBatchAliasUri, 6000);
419+
setCustomSocketTimeout(PushApi.pushListMessageUri, 3000);
420+
setCustomSocketTimeout(PushApi.pushListCidUri, 6000);
421+
setCustomSocketTimeout(PushApi.pushListAliasUri, 6000);
422+
}
423+
424+
public int getCustomSocketTimeout(String uri) {
425+
return Integer.getInteger(uri, this.uriToSocketTimeoutMap.getOrDefault(uri, 0));
426+
}
427+
332428
}

0 commit comments

Comments
 (0)