Я строю кеш, используя кофеин и 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, я знаю, что у него есть событие l oop, которое можно заблокировать и затормозить мое приложение. И runBlocking
приносит мне эту проблему. Поэтому мне нужно обменять это runBlocking
на какой-либо другой ресурс Vertx или, может быть, GlobalScope.launch(vertx.dispacther())
. Тогда я мог бы избежать события блокировки. Проблема в том, что я не знаю, какой ресурс Vertx я мог бы использовать, и я не могу использовать GlobalScope.launch
, поскольку он возвращает задание, а не возвращаемое значение из функции sendRequest
. Любые идеи? Ps .: так как sendRequest
- это приостановленное веселье, я могу назвать его только сопрограммой или другим приостановленным развлечением: (