我试图在Spring中理解反应性端点,这使我感到困惑。
// in a @RestController
@GetMapping("/someendpoint")
fun someEndpoint(): ResponseEntity<Mono<Map<String, Any>>> {
return ResponseEntity(Mono.zip(
Mono.fromRunnable<List<SomeItem>> { someApiCall() },
Mono.fromRunnable<List<SomeOtherItem>> { someOtherApiCall() },
).map { tuple ->
val someItems = tuple.t1
val someOtherItems = tuple.t2
mapOf(
"someItems" to someItems,
"someOtherItems" to someOtherItems
)
}, HttpStatus.OK)
}
我有一个端点,它返回一个Map的Mono,这个想法只是呈现一些任意的JSON。
作为请求的一部分,我执行一个Mono.zip(Mono.fromRunnable {...}),在其中调用API来获取数据。
压缩后,我会对结果进行一个.map映射,最终返回我希望看到的Map。
当我点击端点时,没有呈现JSON,但是zip中的runnable被调用,并且响应时间将这些API调用考虑在内。 .zip之后的.map永远不会被调用。我可能只是在这里不明白一些简单的内容-例如.map未订阅?
这是怎么回事,使用Webflux / Reactor处理这种情况的常用方法是什么?
答案 0 :(得分:0)
正如Rene在评论中提到的那样,我的错误是使用Mono.fromRunnable {}而不是Mono.fromSupplier {}