我一直在深入研究Kotlin Coroutine,发现在使用Kotlin和Coroutine时,挂起函数可以简化异步和非阻塞代码的创建.在Android应用程序中,将网络请求作为挂起函数是防止阻塞主线程的关键.

然而,在Spring Boot应用程序中,主线程的概念不是很突出,在某些情况下,我们需要等待网络调用返回,然后才能继续下一步,这看起来可能有些"阻塞".我甚至try 将关键字Suspend应用于我的客户调用,并在Coroutine中启动它们.有趣的是,Kotlin有时会暗示"Suspend"这个关键字是多余的.

这就提出了这样一个问题:在Spring Boot上下文中,是否可以真正将网络请求或其他I/O绑定操作视为暂停方法或将其实现为挂起方法.如果有一种方法可以将它们实现为挂起函数,这将为REST调用带来什么好处?

// suspend here is redundant...in fact, if this call takes x seconds, my API request thread will be blocked for x seconds
suspend fun makeHttpRequest(): String {
    val client = HttpClient()
    val response = client.get<String>("https://example.com/api/endpoint")
    return response
}

fun main() {
    val numberOfThreads = 4 // Adjust as needed
    val threadPool = newFixedThreadPoolContext(numberOfThreads, "CustomThreadPool")

    runBlocking {
        repeat(numberOfThreads) {
            GlobalScope.launch(Dispatchers.Default + threadPool) {
                val result = makeHttpRequest()
                // Process the result here
            }
        }
    }
}

推荐答案

当且仅当您使用SpringWebflux时,异步/非阻塞网络堆栈才能与协程一起工作.

Spring通过react 器(react 流)和Netty提供与协程的无阻塞兼容性.

你可以在下面的博客帖子部分获得更多信息:Webflux with coroutines API.

Kotlin相关问答推荐

在KMP中使用koin将来自Android的上下文注入到SQLDelight Driver中

Kotlin 海峡没有结束

从 Kotlin 的父类获取函数注解

限制通用Kotlin枚举为特定类型

Kotlin 基于参数类型的返回类型推断

为什么Kotlin不用static inner class来实现带有object关键字的单例呢?

在协程上下文中重新抛出异常

如何在 Spring Boot 3 中为内部类提供运行时提示

Kotlin 启动与启动(Dispatchers.Default)

如何缩短 MaterialTheme.colors.primary?

我什么时候可以在 LazyList 或 Column 的范围内使用 Composable?

Kotlin - 创建指定长度的随机整数的 ArrayList?

对列表中数字的子集求和

带有迭代器函数的 Kotlin 无限序列

在Kotlin中传递并使用函数作为构造函数参数

如何为kotlin异常生成SerialVersionId?

Kotlin中的Memoization功能

在android的默认浏览器 Select 列表中添加我的浏览器?

尾随 lambda 语法(Kotlin)的目的是什么?

var str:String是可变的还是不可变的?