Reactor - Flux需要非过滤器用户

时间:2017-01-06 14:47:42

标签: project-reactor

我正在使用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)
...

关于我做错了什么的想法?

祝你好运

1 个答案:

答案 0 :(得分:1)

EmitterProcessor.create()创建处理器,autoCancel标志设置为true。这意味着一旦所有订阅者取消订阅,它就会自动取消。

您的订阅者取消订阅的原因不是filter,而是takeUntil运营商。

添加额外的永久订阅者可使处理器无法自动取消,但这似乎不是一个好的解决方案。

要使您的测试用例正常工作,您必须使用EmitterProcessor.create(false)创建处理器。这会将autoCancel设置为false,因此您可以反复重新订阅。