首页 > 解决方案 > 如何重试 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> 

标签: javaamazon-dynamodb

解决方案


DynamoDB 类在后台使用 AmazonDynamoDB 客户端。您可以阅读来自 aws-java-sdk-dynamodb 的源代码来检查它。现在,如果我们查看 AmazonDynamoDB#batchWriteItem 方法的文档,我们会看到:

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

因此,这里以某种方式预计会出现异常。

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

AmazonDynamoDB#batchWriteItem 文档


推荐阅读