我正在尝试将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时才出现此行为。我在本地没有这种行为...
答案 0 :(得分:1)
//.thenApply will wait for your future to complete first and then return Mono<T>
Mono.fromFuture(yourCompletableFuture.thenApply(x -> x.doSomething);