DynamoDB 异步 REST 调用

DynamoDB Asynchronous REST call

我想使用 CompletableFuture 异步调用 DynamoDB 并提供了方法:

private CompletableFuture<UpdateItemResult> updateDynamodbAsync(UpdateItemRequest request) {

        return CompletableFuture.supplyAsync(() -> {

            UpdateItemResult result = amazonDynamoDBClient.updateItem(request);

            return result;
        });
    }

代码执行如下:

UpdateItemResult result = null;

CompletableFuture<UpdateItemResult> updateItemResultCompletableFuture = updateDynamodbAsync(updateItemRequest);

                                while (true) {
                                    if (updateItemResultCompletableFuture.isDone()) {
                                        result = updateItemResultCompletableFuture.get(3000, TimeUnit.MILLISECONDS);
                                        break;
                                    }
                                }

while 循环一直阻塞,直到请求完成,我认为这会阻塞进程。代码仍然是异步的吗?如果不是,我该如何改进它?

其次,我将通过空检查单独处理错误:

  if (result == null) {
        LOGGER.debug("The update operation in the DynamoDB is not sucessful .......");
                            return dbPresistenceResponseMap;
        }

还好吗?

你的while(true)循环可以简化为updateItemResultCompletableFuture.join().get().

当然,while 和 join 都会阻塞进程,所以即使你的 DynamoDB 是异步创建的,你也不会从中受益。保持异步执行的正确方法是使用 then…() 方法之一对未来进行链式调用。

例如,您的错误处理可以通过

完成
return updateItemResultCompletableFuture.thenApply(result -> {
    if (result == null) {
        LOGGER.debug("The update operation in the DynamoDB is not sucessful .......");
        return dbPresistenceResponseMap;
    }
    return /* success result */;
}

如果调用者还需要对该结果执行某些操作,您还必须 return 一个 CompletableFuture(因此 return 我放在第一行) .这将允许它链接更多调用。

附带说明一下,使用 supplyAsync() 而不提供 Executor 将使您在 the common ForkJoinPool 上调用 运行,旨在 运行 CPU-绑定任务。由于这是一个 I/O 操作,您应该提供自己的 Executor.

最后,我对 AWS 不熟悉,但请注意 DynamoDB 也有一个 async client,你应该可以使用它。