在 AWS SDK 中,Retry 并非仅适用于元数据服务。Retry 可以用于所有 AWS 服务 API 请求中。以下是一个示例,显示如何使用 RetryHandler 来执行 Amazon DynamoDB 请求以及如何在请求失败时进行自定义 Retry:
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.handlers.RequestHandler2;
import com.amazonaws.retry.RetryUtils;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.*;
import java.util.HashMap;
import java.util.Map;
public class DynamoDBRetry {
public static void main(String[] args) {
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion("us-west-2")
.build();
client.getRequestHandlers().add(new RequestHandler2() {
@Override
public AmazonWebServiceRequest beforeMarshalling(AmazonWebServiceRequest request) {
// Adjust request before marshalling
return request;
}
@Override
public void afterResponse(AmazonWebServiceRequest request, Object response, TimingInfo timingInfo, AmazonWebServiceResponse amazonWebServiceResponse) {
// Adjust response after unmarshalling
}
@Override
public void afterError(AmazonWebServiceRequest request, AmazonClientException e) {
if (RetryUtils.isThrottlingException(e)) {
// Retry on throttling exception
return;
}
if (e instanceof AmazonServiceException) {
AmazonServiceException ase = (AmazonServiceException) e;
if (RetryUtils.isRetryableServiceException(ase)) {
// Throw back exception with delay for custom retry logic
throw ase;
}
}
// Do nothing for other exceptions (e.g. non-AWS or networking issues)
}
});
Map item = new HashMap<>();
item.put("id", new AttributeValue().withN("1"));
item.put("name", new AttributeValue().withS("John Doe"));
PutItemRequest putItemRequest = new PutItemRequest()
.withTableName("my-table")
.withItem(item);
try {
client.putItem(putItemRequest);
} catch (AmazonServiceException e) {
// Handle service exceptions
} catch (AmazonClientException e) {
// Handle client exceptions
}
}
}
在此示例中,我们通过向 AmazonDynamoDBClient 添加 RequestHandler2 的实例来实现自定义 Retry 逻辑。此处理程序