如何重试DynamoDBMapper.失败的批处理项目



当generanddbmapper.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.gynolddbv2.model.ResourceNotFoundException:未找到请求的资源(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ResourceNotFoundException;请求ID:xxxxxxxx(">

根据文档,如果某个东西失败了,它应该在BatchWriteItemOutcome对象中返回,但在我的情况下,它抛出了错误。

我正在使用以下Maven依赖

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
<version>1.11.748</version>
</dependency> 
DynamoDB类在后台使用AmazonDynamoDB客户端。您可以通过阅读awsjavasdkdynolderdb中的源代码来检查它。现在,如果我们查看AmazonDynamoDB#batchWriteItem方法的文档,我们会看到:

ResourceNotFoundException-操作试图访问不存在的表或索引。资源可能未正确指定,或者其状态可能不是ACTIVE

因此,这里的异常是意料之中的。

此外,在查看您的代码时,我注意到您一次又一次地尝试处理未处理的项目,没有超时。当您使用DynamoDB重试未处理的操作时,建议使用回退策略。

AmazonDynamoDB#batchWriteItem文档

相关内容

最新更新