如何通知Flux我有一件物品可以发布?

时间:2018-01-16 14:45:39

标签: kotlin project-reactor

我正在尝试创建一个类来接收传入的用户事件,处理它们然后将结果传递给订阅它的人:

class EventProcessor
{
    val flux: Flux<Result>

    fun onUserEvent1(e : Event)
    {
        val result = process(e)
        // Notify flux that I have a new result
    }

    fun onUserEvent2(e : Event)
    {
        val result = process(e)
        // Notify flux that I have a new result
    }

    fun process(e : Event): Result 
    { 
        ...
    }
}

然后,客户端代码可以订阅EventProcessor::flux,并在每次成功处理用户事件时收到通知。

但是,我不知道该怎么做。我尝试使用flux函数构造Flux::generate,如下所示:

class EventProcessor
{
    private var sink: SynchronousSink<Result>? = null
    val flux: Flux<Result> = Flux.generate{ sink = it }

    fun onUserEvent1(e : Event)
    {
        val result = process(e)
        sink?.next(result)
    }

    fun onUserEvent2(e : Event)
    {
        val result = process(e)
        sink?.next(result)
    }

    ....
}

但这不起作用,因为我应该立即致电next SynchronousSink<Result> Flux::generate传递给我sink。我无法像示例中那样存储Flux::merge

  

reactor.core.Exceptions $ ErrorCallbackNotImplemented:   java.lang.IllegalStateException:生成器没有调用任何一个   SynchronousSink方法

我还在考虑Flux::concatFlux方法,但这些方法是静态的,它们会创建一个新的c++11。我只是想把事情推到现有的变化中,这样任何拥有它的人都会得到通知。

基于我对反应类型的有限理解,这应该是一个常见的用例。但我发现实际实现起来非常困难。这让我怀疑我错过了一些关键的东西,或者我是以一种奇怪的方式使用该库,其中它并不打算被使用。如果是这种情况,我们热烈欢迎任何建议。

0 个答案:

没有答案