【问题标题】:Spring Rest API calling service with Deffered<>带有 Deferred<> 的 Spring Rest API 调用服务
【发布时间】:2022-01-01 15:47:42
【问题描述】:

我的代码功能,但不确定我是否正确实现它。

我有一个服务层,它使用 Retrofit 调用 Youtrack API,进行一些后过滤并返回问题列表。下面的代码是简化版,但应该足够做一张图片了。

suspend fun getProjectIssuesFromYt(
    project: String,
    youTrackInstance: YouTrackInstance,
    after: Int,
    max: Int
): List<Issues> = coroutineScope {
    val service = Youtrack.getYoutrack(youTrackInstance).service
    val deferreds: Deferred<List<Issues>> =
        async(Dispatchers.Default) {
            service.getIssuesByProject(
                project = project, max = max,
                after = after
            ).bodyList()
        }
    deferreds.await()
}

如何从 REST api 调用此服务?唯一可行的解​​决方案是使用runBlocking 调用它,但我认为这不是可行的方法。

@GetMapping("/getProjectIssuesFromYt")
fun getProjectIssuesFromYt(
    project: String,
    youTrackInstance: YouTrackInstance,
    after: Int,
    max: Int
): List<Issues> = runBlocking {
    clientService.getProjectIssuesFromYt(
        project = project,
        youTrackInstance = youTrackInstance,
        after = after,
        max = max
    )
}

我确实尝试让我的控制器功能暂停并在没有 runBlocking 的情况下运行它,但我收到了一个错误。

"Parameter specified as non-null is null: method kotlinx.coroutines.internal.ScopeCoroutine.<init>, parameter context",

提前谢谢你,

马尔科

【问题讨论】:

    标签: spring kotlin async-await kotlin-coroutines


    【解决方案1】:

    如果您使用的是 Spring MVC: Kotlin 协程仅可作为 Spring Web Flux 中 Java 的 Project Reactor 的替代品。 Spring MVC 控制器在设计上是阻塞的,这就是为什么它们不能作为挂起函数实现的原因。 https://spring.io/blog/2019/04/12/going-reactive-with-spring-coroutines-and-kotlin-flow

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 1970-01-01
      • 2015-08-16
      • 2017-12-15
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多