我正在尝试在我们的下一个 Spring Boot 服务中使用 Kotlincoroutines
和spring-data-r2dbc
( )。databaseClient
我已经熟悉这两个概念,但是当我们深入研究实现的细节时,我开始问自己这个问题。
在我看到的大多数示例中,每个返回某种集合的端点在迁移到反应式方法时都将返回 Flow。
虽然没有其他(非阻塞)方式可以使用Mono
/来完成它Flux
,但由于我们想将订阅移交给 engine( Webflux
),但 Kotlin 的情况非常不同Flows
。Flow 的终端操作是暂停的,这使得它们本质上是非阻塞的。这意味着我可以在我得到它的时间和地点以非阻塞方式终止 Flow,并继续进行常规List
,例如。
当然,底层热发布者、反应式传输/协议等可能存在更复杂的场景,但在我的情况下,这是一个非常传统的服务。我们决定使用响应式方法的唯一原因是它受 IO 限制:对于每个 API 调用,我们需要通过 HTTP/REST 从多个其他服务获取数据,然后执行一些数据库查询,然后返回组合结果。List
所以,问题是:如果我可以当场将其简化为常规,例如在存储库中,那么在多个应用程序层(控制器、服务、存储库)中散布 Flow 是否有意义:
suspend fun findByEvent(id: String): List<MyEntity> =
databaseClient.execute(MY_QUERY)....all().asFlow().toList()
这样我的应用程序层的其余部分甚至都不知道Flow
(整个调用链无论如何都将保持可挂起)?