【问题标题】:Does Spring-Boot handle Kotlin coroutines apart from WebFlux context?除了 WebFlux 上下文之外,Spring-Boot 是否处理 Kotlin 协程?
【发布时间】: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 堆栈中使用协程时不再需要使用 runBlockingawait()。更多信息在这里docs.spring.io/spring-framework/docs/current/reference/html/…

标签: spring-boot kotlin kotlin-coroutines


【解决方案1】:

如果你想在不声明 suspend 函数的情况下调用 await(),请将其包装在协程构建器中,如下所示:

@Service
class MyService {
    fun processUsers(): Users {
        return runBlocking { fetchUsersAsync().await() }
    }
}

【讨论】:

  • 抱歉回复晚了:类似的方法有效,谢谢!
猜你喜欢
  • 2021-05-02
  • 2021-07-27
  • 2019-12-04
  • 1970-01-01
  • 2021-01-16
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多