Kotlin 协同程序执行问题某些协同程序获胜';t发射

Kotlin 协同程序执行问题某些协同程序获胜';t发射,kotlin,coroutine,kotlin-coroutines,Kotlin,Coroutine,Kotlin Coroutines,我正在尝试使用spring和kotlin将一些数据转换并刷新到流应用程序中的数据库。性能限制使我使用协程和块来更快地执行转换和持久化过程。 问题是输入数据的大小不等于持久化数据 我的作业计划以固定延迟运行: @Scheduled(fixedDelay = 10_000) fun flushToDb() { // some operations CoroutineScope(getDispatcherExec()).launch { flush(oldStat, i

我正在尝试使用spring和kotlin将一些数据转换并刷新到流应用程序中的数据库。性能限制使我使用协程和块来更快地执行转换和持久化过程。 问题是输入数据的大小不等于持久化数据

我的作业计划以固定延迟运行:

@Scheduled(fixedDelay = 10_000)
fun flushToDb() {
    // some operations
    CoroutineScope(getDispatcherExec()).launch {
        flush(oldStat, isFlushing)
    }
}
这是我的暂停功能:

private suspend fun flush(oldStat: Map<String, AppDailyStatsModel>, isFlushing: AtomicBoolean) {
    logger.info("RedisFlush ${oldStat.size} starts")
    val start = System.currentTimeMillis()
    val count = AtomicLong(0)
    val startCount = AtomicLong(0)
    val newStat = AtomicLong(0)
    val updateStat = AtomicLong(0)
    val input = oldStat.values
    coroutineScope {

        input
                .chunked(1000)
                .forEach { models ->
                    launch {
                        try {
            startCount.addAndGet(models.size.toLong())
                            // Transform

            // Persist
                            count.addAndGet(models.size.toLong())
                            logger.info("Flushed  ${count.get()}")
                        } catch (e: Exception) {
                            logger.error("PROBLEM IN SAVE ", e)
                        }
                    }
                }
    }
}
private-suspend-fun-flush(oldStat:Map,isflush:AtomicBoolean){
info(“重新刷新${oldStat.size}开始”)
val start=System.currentTimeMillis()
val计数=原子长(0)
val startCount=AtomicLong(0)
val newStat=AtomicLong(0)
val updateStat=AtomicLong(0)
val输入=oldStat.values
共线镜{
输入
.分块(1000)
.forEach{models->
发射{
试一试{
startCount.addAndGet(models.size.toLong())
//转化
//坚持
count.addAndGet(models.size.toLong())
logger.info(“刷新${count.get()}”)
}捕获(e:例外){
logger.错误(“保存中的问题”,e)
}
}
}
}
}
问题是
计数
开始计数
相等,并且小于
输入


任何帮助都将不胜感激

您可以检查是否等待了足够的时间,等待所有已启动的协同路由完成。您可以在启动功能后添加
join
调用,等待所有活动完成后再进行检查。它也可以是Map或AppDailyStatsModel中的并发class@EugenePetrenkocoroutineScope确保所有活动都完成,然后我打印出计数器。@EugenePetrenko什么问题?你有什么想法吗?首先为什么要使用协同程序,你在调用什么
suspend
函数吗?如果您只是想要并行化,请使用Java流。您甚至不必手动将输入分块。我的第一次尝试是将所有内容包装在
runBlocking()
中。但是,正如我已经说过的,我不确定你从合作中首先会得到什么。