当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>
ResourceNotFoundException-操作试图访问不存在的表或索引。资源可能未正确指定,或者其状态可能不是ACTIVE
因此,这里的异常是意料之中的。
此外,在查看您的代码时,我注意到您一次又一次地尝试处理未处理的项目,没有超时。当您使用DynamoDB重试未处理的操作时,建议使用回退策略。
AmazonDynamoDB#batchWriteItem文档