Как создать моно из завершаемого будущего - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь обернуть CompletableFuture внутри типа Reactor Mono, чтобы упростить мои операции преобразования. Project Reactor в целом удобнее! Я работаю внутри лямбда-функции AWS и вызываю сервисы AWS, такие как S3, SQS и т. Д., Используя новую версию AWS Java SDK 2.x. Этот новый SDK позволяет выполнять асинхронные вызовы службам AWS и возвращает объекты CompleteableFuture.

Например:

S3AsyncClient s3AsyncClient = S3AsyncClient.builder().build();    
Mono.fromFuture(s3AsyncClient.getObject(b -> 
b.bucket(bucketId).key(objectKey), AsyncResponseTransformer.toBytes()).subscribe()
System.out.println("stuff");

Проблема в том, что когда мой основной код вызывает CompletableFuture (s3AsyncClient.getObject), внезапно поток выполнения переключается на поток CompleteableFuture, и мой основной метод, который вызвал Mono, возвращается до завершения CompletableFuture.

В основном, из приведенного выше примера, строка "stuff" печатается до завершения s3AsyncClient.getObject.

Как я могу убедиться, что Mono и CompletableFuture выполняются в одном и том же потоке, или как убедиться, что моя лямбда не завершает работу до того, как CompletableFuture завершится?

Для тех, кто интересуется, такое поведение возникает только при удаленном развертывании кода на AWS Lambda. Я не испытываю такого поведения локально ...

1 Ответ

0 голосов
/ 06 марта 2019

//.thenApply will wait for your future to complete first and then return Mono<T> Mono.fromFuture(yourCompletableFuture.thenApply(x -> x.doSomething);

...