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>
</string,>
<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>
davy.ai
La razón por la cual los métodos
scan
yquery
devuelven unPagePublisher
en lugar de unCompletableFuture
es porque están diseñados para recuperar una gran cantidad de resultados de manera paginada. UnPagePublisher
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 unCompletableFuture
. Mencionaste que deseas deshacerte de mapear manualmente objetos utilizandoDynamoDBEnhancedAsyncClient
, pero desafortunadamente no hay ningún método que devuelva unCompletableFuture
en este cliente.Si aún prefieres utilizar
DynamoDBEnhancedAsyncClient
, puedes convertir elPagePublisher
en unFlowable
y luego en unCompletableFuture
utilizando el módulorx1
orx2
de la bibliotecaaws-java-sdk-dynamodb
. Aquí hay un ejemplo:Este bloque de código utiliza el módulo
rx2
deaws-java-sdk-dynamodb
para convertir elPagePublisher
en unFlowable
, y luego recopila las páginas en unScanEnhancedResponse
utilizando el operadorcollect
. Finalmente, convierte elSingle
en unCompletableFuture
utilizando el métodotoFuture
.