Как я могу получить возвращаемое значение из области сопрограмм в Kotlin? - PullRequest
0 голосов
/ 22 января 2020

Я строю кеш, используя кофеин и 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 - это приостановленное веселье, я могу назвать его только сопрограммой или другим приостановленным развлечением: (

...