Skip to content

Commit 0ef8043

Browse files
author
yuguo.dtpe
committed
fix: retry AbstractResponse case error
1 parent 1aee176 commit 0ef8043

File tree

1 file changed

+34
-2
lines changed

1 file changed

+34
-2
lines changed

volcengine-java-sdk-core/src/main/java/com/volcengine/retryer/DefaultRetryCondition.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.Arrays;
1414
import java.util.Collections;
1515
import java.util.HashSet;
16+
import java.util.Map;
1617
import java.util.Set;
1718

1819
public class DefaultRetryCondition extends RetryCondition{
@@ -52,8 +53,16 @@ public boolean shouldRetry(ApiResponse response, ApiException apiException) {
5253
if (response != null) {
5354
statusCode = response.getStatusCode();
5455
if (response.getData() != null) {
55-
AbstractResponse abstractResponse = (AbstractResponse)response.getData();
56-
errorCode = getErrorCode(abstractResponse.getResponseMetadata());
56+
if (response.getData() instanceof AbstractResponse) {
57+
AbstractResponse abstractResponse = (AbstractResponse)response.getData();
58+
errorCode = getErrorCode(abstractResponse.getResponseMetadata());
59+
}
60+
61+
if (response.getData() instanceof Map){
62+
Map<String, Object> map = (Map<String, Object>)response.getData();
63+
errorCode = getErrorCodeFromMap(map, String.class,"ResponseMetadata", "Error", "Code");
64+
}
65+
5766
}
5867
}
5968

@@ -68,6 +77,29 @@ public boolean shouldRetry(ApiResponse response, ApiException apiException) {
6877
return false;
6978
}
7079

80+
private <T> T getErrorCodeFromMap(Map<String, Object> map, Class<T> responseType, String ... keys) {
81+
if (map == null || keys == null || keys.length == 0) {
82+
return null;
83+
}
84+
Map<String, Object> currentMap = map;
85+
for (int i = 0; i < keys.length; i++) {
86+
String key = keys[i];
87+
if (!currentMap.containsKey(key)){
88+
break;
89+
}
90+
Object value = currentMap.get(key);
91+
if (i < keys.length - 1) { // 还没到最后一层
92+
if (!(value instanceof Map)){
93+
return null;
94+
}
95+
currentMap = (Map<String, Object>) value;
96+
}else {
97+
return responseType.cast(value);
98+
}
99+
}
100+
return null;
101+
}
102+
71103
private String getErrorCode(ResponseMetadata responseMetadata) {
72104
if (responseMetadata != null && responseMetadata.getError() != null ) {
73105
return responseMetadata.getError().getCode();

0 commit comments

Comments
 (0)