Kotlin coroutines kotlin协同程序,定期发送数据并检查订户计数

Kotlin coroutines kotlin协同程序,定期发送数据并检查订户计数,kotlin-coroutines,flow,Kotlin Coroutines,Flow,我在spring boot上有一个带有rSocket服务的服务器: @MessageMapping("get-messages") fun getMessageById(): Flow<Set<Message>> { return flow { emit(service.getLatestMessages()) } } @MessageMapping(“获取消息”) fun getMessageById():流{ 返回流{emit(servi

我在spring boot上有一个带有rSocket服务的服务器:

@MessageMapping("get-messages")
fun getMessageById(): Flow<Set<Message>> {
    return flow { emit(service.getLatestMessages()) }
}
@MessageMapping(“获取消息”)
fun getMessageById():流{
返回流{emit(service.getLatestMessages())}
}
因为repo不是反应性的,所以我希望定期访问数据库获取数据,并将其提供给订阅者(如果存在)

我希望像这样使用StateFlow:

private val stateFlowMessages = MutableStateFlow<Set<Message>>(emptySet())
init {
    CoroutineScope(Dispatchers.IO).launch {
        while(true){
            if (stateFlowProducts.subscriptionCount.value > 0) 
                stateFlowProducts.value = service.getLatestMessages()
            delay(6 * 1000)
        }
    }
}
private val stateFlowMessages=MutableStateFlow(emptySet())
初始化{
协同路由示波器(Dispatchers.IO)。启动{
while(true){
如果(stateFlowProducts.subscriptionCount.value>0)
stateFlowProducts.value=service.getLatestMessages()
延时(6*1000)
}
}
}
但是订阅者总是0,我认为“while”加上“delay”不是最好的做法吗

0. subscriptionCount: `0       1      2     0     2`
1. Map to true/false: `false  true  true false true`
2. Distinct.        : `false  true       false true`
3. Filter.          : `       true             true`
3. MapLatest.       : `         list             list`.
stateFlowProducts.subscriptionCount
.map{it>0}
.distinctUntilChanged()
.filter{it}
.mapLatest{service.getLatestMessages()}
.onEach{stateFlowProducts.value=it}
.launchIn(范围)

谢谢你的回答,这正是我需要的。但在docs distinctUtilChanged next中:“…因此将distinctUtilChanged应用于StateFlow没有任何效果。”并且此方法是可选的?在
map{}
之后,返回的流不是StateFlow:)