Загрузите несколько объектов JPA, используя сопрограмму Kotlin - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь загрузить несколько объектов, используя сопрограммы Hibernate и Kotlin на уровне приложений.Делая что-то вроде этого.

fun load() : SomeData {

    val steps = someFunctionCallToGetSteps()

    val stepCollection : List<Step> = MutableList()

    runBlocking {

        for (step in steps) {

            val s = async { getStepData(step) }
            payers.add(s.await())
        }
    }
}

private suspend fun getStepData(step : Int) : Iterable<Step> {

    return someComputation()
}

Но этот подход не верен, потому что я использую await сразу, чтобы он не был асинхронным.Мне сказали собрать все отсрочки и использовать awaitAll, но я нигде не могу найти ни одного примера.Можно ли это сделать?

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Если я правильно понял, вам нужно что-то подобное для достижения своей цели.Позвоните нескольким async строителям и затем сопоставьте Deferred с Step с.Вместо этого Dispatchers.Default было бы лучше создать собственного диспетчера .

data class Step(val step: Int)

fun main(args: Array<String>) = runBlocking {

    val steps = someFunctionCallToGetSteps()

    val result = coroutineScope {
        val defferedSteps = steps.map {
            async(Dispatchers.Default) {
                getStepData(it)
            }
        }
        defferedSteps.map { deferred -> deferred.await() }
    }

    for (step in result)
        println(step)
}

fun someFunctionCallToGetSteps(): List<Int> {
    return listOf<Int>(1, 2, 3, 4)
}

suspend fun getStepData(step: Int): Step {
    println("[${Thread.currentThread().name}] loading...")
    delay(500)
    return Step(step)
}
0 голосов
/ 26 декабря 2018

Наконец-то я смог решить эту проблему.Я публикую ответ с надеждой, что другие могут извлечь из этого пользу.

fun load() : List<Result> {

    val steps = someFunctionCallToGetSteps()
    val result: List<Result> = ... 

    runBlocking {

        val stepsDeferred = steps.map { async { getStepData(it) } }

        stepsDeferred.awaitAll().forEach { result.add(it) }
    }

    return result
}

private suspend fun getStepData(step : Int) : Iterable<Step> {

    return someComputation()
}
0 голосов
/ 22 декабря 2018

Возьмите каждый s в список и вне цикла for do awaitAll(yourListOfs)

...