【发布时间】:2020-05-15 15:35:25
【问题描述】:
我们正在尝试使用 Kotlin 协程在 Spring-Boot 后端进行异步处理。
问题是它似乎不能很好地支持它(至少是标准的 Spring MVC)。
基本上,如果我们有一个执行异步逻辑的函数:
fun fetchUsersAsync(): Deferred<Users> {
return GlobalScope.async {
...
}
}
并且此函数在服务中的某个点与await 一起使用,这需要将suspend 注释放在调用服务函数中:
@Service
class MyService {
suspend fun processUsers(): Users {
return fetchUsersAsync().await()
}
}
不幸的是,这是不可能的,服务中挂起功能的唯一参考是与 WebFlux 连接的。
有人遇到过同样的情况吗?谢谢。
【问题讨论】:
-
您在服务和端点中的公共功能不应该是可暂停的。里面的代码很容易异步。我不知道你定义 'processUsers()' 暂停的主要目标是什么?
-
感谢@Neo 的回复!主要思想是 await() 调用应该在挂起函数中。
-
Spring Boot 2.4.0 和 Spring 5.3 在 MVC servlet 堆栈中提供了对 Kotlin Coroutines 的支持,因此您可以毫无问题地声明挂起函数。在 servlet 堆栈中使用协程时不再需要使用
runBlocking和await()。更多信息在这里docs.spring.io/spring-framework/docs/current/reference/html/…
标签: spring-boot kotlin kotlin-coroutines