es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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í?

Tags:  , , , ,

Answer

  1. Avatar for 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étodo join() de CompletableFuture en lugar del bucle while. 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í:

    CompletableFuture<updateitemresult> updateItemResultCompletableFuture = updateDynamodbAsync(updateItemRequest);
    UpdateItemResult result = updateItemResultCompletableFuture.join();
    

    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() de CompletableFuture para manejar cualquier excepción que ocurra durante el procesamiento de la solicitud. Aquí tienes un ejemplo:

    CompletableFuture<updateitemresult> updateItemResultCompletableFuture = updateDynamodbAsync(updateItemRequest);
    updateItemResultCompletableFuture.exceptionally(ex -> {
        LOGGER.debug("La operación de actualización en DynamoDB no ha tenido éxito....");
        // devuelve un valor predeterminado o lanza una excepción
    });
    UpdateItemResult result = updateItemResultCompletableFuture.join();
    

    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.

Comments are closed.