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,你应该可以使用它。
我想使用 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,你应该可以使用它。