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.

Usando DynamoDBEnhancedAsyncClient para escanear y obtener futureObject

Estoy intentando usar la biblioteca v2 para persistir y recuperar datos de manera no bloqueante.
El método de inserción de DynamoDBEnhancedAsyncClient devuelve un objeto CompletableFuture, pero los métodos de escaneo y consulta devuelven un objeto PagePublisher, lo cual parece indicar que esta es una llamada bloqueante. ¿Alguien puede ayudarme a entender/ solucionar esto? Quiero implementar llamadas no bloqueantes de principio a fin. Intenté con DynamoAsyncClient y funciona perfectamente, pero quiero deshacerme de la asignación manual de objetos utilizando DynamoDBEnhancedAsyncClient, pero no veo ningún método que devuelva CompletableFutures.

Aquí está mi bloque de código:

DynamoDbAsyncTable<user> asyncTable = dynamoDBEnhancedAsyncClient.table("userTable", TableSchema.fromBean(User.class));
Map<string, attributevalue=""> expVal = new HashMap();
expVal.put(":val", AttributeValue.builder().n(String.valueOf(userId)).build());
Expression exp = Expression.builder().expression("userId = :val").expressionValues(expVal).build();
ScanEnhancedRequest req = ScanEnhancedRequest.builder().filterExpression(exp).build();
PagePublisher<user> pagePublisher = asyncTable.scan(req);

Las dependencias que usé:
<dependency>
<groupid>software.amazon.awssdk</groupid>
<artifactid>dynamodb</artifactid>
<version>2.10.76</version>
</dependency>
<dependency>
<groupid>software.amazon.awssdk</groupid>
<artifactid>dynamodb-enhanced</artifactid>
<version>2.12.0</version>
</dependency>
</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual los métodos scan y query devuelven un PagePublisher en lugar de un CompletableFuture es porque están diseñados para recuperar una gran cantidad de resultados de manera paginada. Un PagePublisher es un flujo reactivo que permite a los consumidores recibir los datos a medida que están disponibles, en lugar de esperar a que se cargue todo el conjunto de resultados en la memoria.

    Si deseas utilizar la biblioteca v2 para persistir y recuperar datos de manera no bloqueante, puedes utilizar DynamoDbAsyncClient y sus métodos asíncronos correspondientes, los cuales devuelven un CompletableFuture. Mencionaste que deseas deshacerte de mapear manualmente objetos utilizando DynamoDBEnhancedAsyncClient, pero desafortunadamente no hay ningún método que devuelva un CompletableFuture en este cliente.

    Si aún prefieres utilizar DynamoDBEnhancedAsyncClient, puedes convertir el PagePublisher en un Flowable y luego en un CompletableFuture utilizando el módulo rx1 o rx2 de la biblioteca aws-java-sdk-dynamodb. Aquí hay un ejemplo:

    import io.reactivex.Flowable;
    import io.reactivex.Single;
    import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient;
    import software.amazon.awssdk.enhanced.dynamodb.ScanEnhancedRequest;
    import software.amazon.awssdk.enhanced.dynamodb.model.Page;
    import software.amazon.awssdk.enhanced.dynamodb.model.ScanEnhancedResponse;
    
    DynamoDbEnhancedAsyncClient enhancedAsyncClient = DynamoDbEnhancedAsyncClient.builder().build();
    // crear ScanEnhancedRequest
    ScanEnhancedRequest request = ...
    // obtener PagePublisher
    PagePublisher<user> pagePublisher = asyncTable.scan(request);
    // convertir a Flowable
    Flowable<><user>> flowable = Flowable.fromPublisher(pagePublisher);
    // obtener Single de ScanEnhancedResponse
    Single<><user>> single = flowable.collect(ScanEnhancedResponse::create, ScanEnhancedResponse::addPage);
    // convertir a CompletableFuture
    CompletableFuture<><user>> future = single.toFuture();
    

    Este bloque de código utiliza el módulo rx2 de aws-java-sdk-dynamodb para convertir el PagePublisher en un Flowable, y luego recopila las páginas en un ScanEnhancedResponse utilizando el operador collect. Finalmente, convierte el Single en un CompletableFuture utilizando el método toFuture.

Comments are closed.