如何从操作列表创建接收器

时间:2018-12-31 15:23:33

标签: akka-stream

我想在akka流中创建一个接收器,该接收器由许多操作组成。 例如,贴图,过滤,折叠然后下沉。 目前,我能做的最好的事情如下。 我不喜欢它,因为即使我只允许一个值通过,也必须指定广播。 有谁知道这样做的更好方法?

def kafkaSink(): Sink[PartialBatchProcessedResult, NotUsed] = {
    Sink.fromGraph(GraphDSL.create() { implicit b =>
    import GraphDSL.Implicits._
    val broadcast = b.add(Broadcast[PartialBatchProcessedResult](1))
    broadcast.out(0)
    .fold(new BatchPublishingResponseCollator()) { (c, e) => c.consume(e) }
    .map(_.build())
    .map(a =>
      FunctionalTesterResults(sampleProjectorConfig, 0, a)) ~> Sink.foreach(new KafkaTestResultsReporter().report)
  SinkShape(broadcast.in)
})

}

1 个答案:

答案 0 :(得分:0)

akka-stream要记住的一个关键点是,任意数量的Flow值加上一个Sink值仍然是接收器。

几个演示此属性的示例:

val intSink : Sink[Int, _] = Sink.head[Int]

val anotherSink : Sink[Int, _] = 
  Flow[Int].filter(_ > 0)
           .to(intSink)

val oneMoreSink : Sink[Int, _] = 
  Flow[Int].filter(_ > 0)
           .map(_ + 4)
           .to(intSink)

因此,您可以将mapfilter实现为流。您要查询的fold可以通过Sink.fold来实现。