如何从Kotlin中的协同程序作用域获取返回值?
我正在用咖啡因和Kotlin建立一个缓存。我有这样的想法:如何从Kotlin中的协同程序作用域获取返回值?,kotlin,vert.x,kotlin-coroutines,caffeine,Kotlin,Vert.x,Kotlin Coroutines,Caffeine,我正在用咖啡因和Kotlin建立一个缓存。我有这样的想法: private val esCache: Cache<EsRequestParam, EsResponse> = Caffeine.newBuilder() .expireAfterWrite(30, TimeUnit.SECONDS) .refreshAfterWrite(50, TimeUnit.SECONDS) .build<EsRequestParam, EsResponse> {
private val esCache: Cache<EsRequestParam, EsResponse> = Caffeine.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS)
.refreshAfterWrite(50, TimeUnit.SECONDS)
.build<EsRequestParam, EsResponse> {
runBlocking {
sendRequest(it)
}
}
private suspend fun sendRequest(requestParams: EsRequestParam): EsResponse? {
val result = client
.sendJsonObjectAwait(
JsonObject(
buildPostBody(requestParams)
))
.bodyAsJson(EsResponse::class.java)
esCache.put(requestParams, result)
return result
}
private-val-esCache:Cache=caffee.newBuilder()
.expireAfterWrite(30,时间单位。秒)
.refreshAfterWrite(50,时间单位:秒)
.建造{
运行阻塞{
发送请求(it)
}
}
私有挂起fun sendRequest(requestParams:EsRequestParam):EsResponse?{
val结果=客户端
.SendJSONObject等待(
JsonObject(
buildPostBody(requestParams)
))
.bodyAsJson(EsResponse::class.java)
esCache.put(请求参数,结果)
返回结果
}
因为我也在使用Vertx,所以我知道它有一个事件循环,可以阻止并阻止我的应用程序。运行阻塞给我带来了这个问题。因此,我需要将这个运行阻塞
交换给其他一些Vertx资源,或者可能是GlobalScope.launch(Vertx.dispacher())
。这样我就可以避免阻塞事件。
问题是:我不知道我可以使用哪个Vertx资源,也不能使用GlobalScope.launch
,因为它返回一个作业,而不是sendRequest
函数返回的值。
有什么想法吗?
注:由于
sendRequest
是一个暂停的乐趣,我只能从协同程序或其他暂停的乐趣中调用它:(也许尝试使用AsyncLoadingCache可以在未来和协同程序之间转换?我不知道咖啡因是什么,但在main
函数的顶层之外的任何地方使用runBlocking
几乎都是错误的。有一个先验知识可能会对您有所帮助。