Kotlin coroutines kotlin协同程序,定期发送数据并检查订户计数
我在spring boot上有一个带有rSocket服务的服务器: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
@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:)