Llamada REST asincrónica de DynamoDB
Me gustaría realizar una llamada REST asincrónica a DynamoDB utilizando CompletableFuture
, y se proporciona el siguiente método:
private CompletableFuture<updateitemresult> updateDynamodbAsync(UpdateItemRequest request) {
return CompletableFuture.supplyAsync(() -> {
UpdateItemResult result = amazonDynamoDBClient.updateItem(request);
return result;
});
}
A continuación, se muestra la ejecución del código:
UpdateItemResult result = null;
CompletableFuture<updateitemresult> updateItemResultCompletableFuture = updateDynamodbAsync(updateItemRequest);
while (true) {
if (updateItemResultCompletableFuture.isDone()) {
result = updateItemResultCompletableFuture.get(3000, TimeUnit.MILLISECONDS);
break;
}
}
El bucle while
se bloquea hasta que se completa la solicitud y creo que esto bloquea el proceso. ¿El código sigue siendo asíncrono y, si no, cómo puedo mejorarlo?
En segundo lugar, manejaría los errores por separado con una comprobación de nulo:
if (result == null) {
LOGGER.debug("La operación de actualización en DynamoDB no fue exitosa .......");
return dbPresistenceResponseMap;
}
¿Está bien así?
davy.ai
El código no es completamente asíncrono ya que el bucle
while
se bloquea hasta que se complete la solicitud. Para mejorarlo, puedes usar el métodojoin()
deCompletableFuture
en lugar del buclewhile
.join()
devuelve el resultado si ya está completado o espera la finalización si no lo está. Por lo tanto, el código actualizado se verá así:En cuanto al manejo de errores, no se recomienda utilizar una verificación de nulos para el manejo de errores. En su lugar, debes usar el método
exceptionally()
deCompletableFuture
para manejar cualquier excepción que ocurra durante el procesamiento de la solicitud. Aquí tienes un ejemplo:El uso de
exceptionally()
asegura que cualquier excepción se maneje adecuadamente y puedes devolver un valor predeterminado o lanzar una excepción personalizada para manejar el error.