AWS DynamoDB Java BatchWriteItem连接重置错误

时间:2012-10-22 19:26:04

标签: java amazon-web-services amazon-dynamodb

com.amazonaws.AmazonClientException: Unable to execute HTTP request: Connection reset
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:324)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:164)
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:985)
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.batchWriteItem(AmazonDynamoDBClient.java:365)
    .
    .
    .

尝试运行以下code sample时会捕获到上述异常。

BatchWriteItemResult result;
BatchWriteItemRequest batchWriteItemRequest = new BatchWriteItemRequest();
do {
    System.out.println("Making the request.");                         
    batchWriteItemRequest.withRequestItems(requestItems);
    result = client.batchWriteItem(batchWriteItemRequest);

    // Print consumed capacity units
    for(Map.Entry<String, BatchWriteResponse> entry : result.getResponses().entrySet()) {
        String tableName = entry.getKey();
        Double consumedCapacityUnits = entry.getValue().getConsumedCapacityUnits();
        System.out.println("Consumed capacity units for table " + tableName + ": " + consumedCapacityUnits);
     }

  // Check for unprocessed keys which could happen if you exceed provisioned throughput
    System.out.println("Unprocessed Put and Delete requests: \n" + result.getUnprocessedItems());
    requestItems = result.getUnprocessedItems();
} while (result.getUnprocessedItems().size() > 0);

我有1个表设置,配置了8个写单元。

在我的BatchWriteItemRequest我有9 PutRequestItems

当第一次进入while循环时,处理了9个PutRequestItem中的8个。 因此,再次输入循环,尝试处理剩余的一个请求。

但是,代码会挂起 result = client.batchWriteItem(batchWriteItemRequest);约149秒。之后,抛出上述异常。

似乎绕过这个的唯一方法是设置更高的写配置单元。但是,while-do循环不是一种处理我们超出配置的写入单位的情况的方法吗?

2 个答案:

答案 0 :(得分:0)

AWS SDK for Java的一个版本以您描述的方式破坏了重试行为。基本上,请求的输入流没有在尝试之间重置,因此每次重试都会立即失败。默认情况下,DynamoDB会以指数退避方式执行10次重试,从而导致您看到很长的延迟。更新SDK以解决此问题:

http://aws.amazon.com/sdkforjava/

答案 1 :(得分:0)

这似乎是Java Driver v.1.3.21(或者可能包括旧版本)的错误。

1.3.21.1的发布只是为了解决这个问题:

  

已解决的问题

     

请求重试期间出现SocketException

     

修复了服务错误响应导致重试的问题(即   没有IO错误重试)无法正确重新发送请求   用于使用请求的Amazon DynamoDB等服务的有效负载   有效载荷。

请参阅http://aws.amazon.com/releasenotes/Java/5659251433242996