java - 如何重试 DynamoDBMapper.FailedBatch 项目?
问题描述
当 dynamodbmapper.save/writeitem 返回一些未处理的项目时,我想重试失败的项目。以下是我迄今为止尝试过的代码片段。
List<UserDetails> userDetails = buildUserDeatails();
//List<DynamoDBMapper.FailedBatch> failedBatches = mapper.batchSave(userDetails);
List<DynamoDBMapper.FailedBatch> failedBatches = mapper.batchWrite(userDetails,new ArrayList<UserDetails>());
System.out.println("Failed batches" + failedBatches.size());
for (FailedBatch failedBatch : failedBatches) {
System.out.println("Failed batches process start*********");
Map<String, List<WriteRequest>> batchUnprocessedItems = failedBatch.getUnprocessedItems();
System.out.println("Failed batches process size from mapper*********" + batchUnprocessedItems.size());
do {
if (batchUnprocessedItems.size() == 0) {
System.out.println("All items processed.");
} else {
System.out.println("Gathering unprocessed items...and retrying using batchWrite");
BatchWriteItemOutcome outcome = dynamoDB.batchWriteItemUnprocessed(batchUnprocessedItems);
System.out.println("After Retry...and retrying using batchWrite "
+ outcome.getUnprocessedItems().size());
batchUnprocessedItems = outcome.getUnprocessedItems();
System.out.println("Rerty done***********");
}
} while (batchUnprocessedItems.size() > 0);
}
System.out.println("end process");
}
为了测试上面的代码,我在 userPojo 类中映射了错误的表名(在 dynamoDB 中不存在)
当重试逻辑正在执行时,它会抛出 com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException: Requested resource not found (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: xxxxxxxx)”
根据文档,如果出现故障,它应该在BatchWriteItemOutcome对象中返回,但在我的情况下它会抛出错误。
我正在使用以下 Maven 依赖项
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
<version>1.11.748</version>
</dependency>
解决方案
DynamoDB 类在后台使用 AmazonDynamoDB 客户端。您可以阅读来自 aws-java-sdk-dynamodb 的源代码来检查它。现在,如果我们查看 AmazonDynamoDB#batchWriteItem 方法的文档,我们会看到:
ResourceNotFoundException - 操作试图访问不存在的表或索引。资源可能未正确指定,或者其状态可能不是 ACTIVE
因此,这里以某种方式预计会出现异常。
此外,查看您的代码,我注意到您一遍又一遍地重试处理未处理的项目而没有超时。当您使用 DynamoDB 重试未处理的操作时,建议使用回退策略。
推荐阅读
- java - 报警管理器执行方法
- spring-boot - logback:来自 application.properties 的 FileNamePattern
- r - 用 geom_boxplot 替换 geom_rug 以获得大量数据
- sql - SQL - 如果不存在
- java - 从数据库到 javafxtableview 的 id 和 name 如何相等?
- mysql - 如何根据标签过滤帖子?
- reactjs - ReactJS 错误:TypeError:this.state.data 未定义
- c++ - 使用 CRTP 和 google 测试框架的库 api
- opencv - 如何在 OpenCV python 中使用 inRange() 更改特定像素的颜色以获取 BGR 值
- amazon-web-services - AWS AppSync 版本控制