如何从completableFuture创建单声道

时间:2019-01-11 22:40:11

标签: aws-lambda aws-sdk project-reactor completable-future

我正在尝试将CompletableFuture包装在Reactor Mono类型中,以简化转换操作。一般来说,Project Reactor更方便!我正在使用AWS Lambda函数,并且正在使用新的AWS Java SDK 2.x版本调用诸如S3,SQS等的AWS服务。这个新的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在同一线程中执行,或者如何确保lambda在CompletableFuture完成之前没有终止?

对于那些想知道的人,只有在将代码远程部署到AWS Lambda时才出现此行为。我在本地没有这种行为...

1 个答案:

答案 0 :(得分:1)

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