无法使用带有akka流源的reactivestream Subscriber

时间:2017-02-08 21:24:10

标签: akka-stream reactive-streams

我试图将响应流用户连接到akka源。

我的来源似乎可以使用一个简单的水槽(如foreach) - 但如果我放入一个真正的水槽,由订户制作,我什么也得不到。

我的背景是:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Sink, Source}
import org.reactivestreams.{Subscriber, Subscription}

implicit val system =  ActorSystem.create("test")
implicit val materializer = ActorMaterializer.create(system)

class PrintSubscriber extends Subscriber[String] {
  override def onError(t: Throwable): Unit = {}
  override def onSubscribe(s: Subscription): Unit = {}
  override def onComplete(): Unit = {}
  override def onNext(t: String): Unit = {
    println(t)
  }
}

我的测试用例是:

val subscriber = new PrintSubscriber()
val sink = Sink.fromSubscriber(subscriber)

val source2 = Source.fromIterator(() => Iterator("aaa", "bbb", "ccc"))
val source1 = Source.fromIterator(() => Iterator("xxx", "yyy", "zzz"))
source1.to(sink).run()(materializer)
source2.runForeach(println)

我得到输出:

aaa
bbb
ccc

为什么我没有得到xxx,yyy和zzz?

1 个答案:

答案 0 :(得分:2)

引用下面Subscriber的反应流规范:

  

通过后,将收到一次onSubscribe(订阅)的电话   Publisher.subscribe(订阅者)的订阅者实例。没有进一步的   将收到通知,直到Subscription.request(long)为止   调用。

您可以看到一些项目流向订阅者的最小变化是

override def onSubscribe(s: Subscription): Unit = {
  s.request(3)
}

但是,请记住,这不会使其完全符合Reactive Streams specs。它实现起来并不容易,这是Akka-Streams本身等高级工具包背后的主要原因。