我正在使用 Caffeine 和 Kotlin 构建缓存。我有这样的事情:
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
}
因为我也在使用 Vertx,所以我知道它有一个事件循环,可以阻止并阻止我的应用程序。并runBlocking
给我带来了这个问题。所以我需要将其交换runBlocking
为其他一些 Vertx 资源,或者可能是GlobalScope.launch(vertx.dispacther())
. 然后我可以避免阻塞事件。问题是:我不知道我可以使用哪个 Vertx 资源,也不能使用,GlobalScope.launch
因为它返回的是 Job,而不是sendRequest
函数的返回值。有任何想法吗?Ps.:既然sendRequest
是暂停的乐趣,我只能从协程或其他暂停的乐趣中调用它:(