我正在使用Reactor,我正在创建一个我正在发布一些事件的流量。 我的问题是,我使用过滤器创建的订阅者在一段时间后会失败,除非我在流量上添加非过滤器订阅者。
import reactor.core.publisher.EmitterProcessor
class PublishSubscribe {
companion object {
@JvmStatic
fun main(args: Array<String>) {
val publisher = EmitterProcessor.create<String>().connect()
writeAndGet(publisher)
writeAndGet(publisher)
writeAndGet(publisher)
}
fun writeAndGet(publisher: EmitterProcessor<String>) {
val result = publisher
.filter { true }
.takeUntil { it == "end" }
.collectList()
.subscribe()
val result2 = publisher
.filter { true }
.takeUntil { it == "end" }
.collectList()
.subscribe()
Thread.sleep(1000)
publisher.onNext("unu")
publisher.onNext("end")
try {
println("X=" + result.blockMillis(3000))
println("Y=" + result2.blockMillis(3000))
} catch (e: Exception) {
e.printStackTrace()
}
println(result.isTerminated)
println(result2.isTerminated)
println("---")
}
}
}
如果我是额外的订阅者,代码工作正常。
...
val publisher = EmitterProcessor.create<String>().connect()
publisher.subscribe() //this solves the issue
writeAndGet(publisher)
...
关于我做错了什么的想法?
祝你好运
答案 0 :(得分:1)
EmitterProcessor.create()
创建处理器,autoCancel
标志设置为true
。这意味着一旦所有订阅者取消订阅,它就会自动取消。
您的订阅者取消订阅的原因不是filter
,而是takeUntil
运营商。
添加额外的永久订阅者可使处理器无法自动取消,但这似乎不是一个好的解决方案。
要使您的测试用例正常工作,您必须使用EmitterProcessor.create(false)
创建处理器。这会将autoCancel
设置为false
,因此您可以反复重新订阅。