Kafka Stream

时间:2019-04-10 19:44:40

标签: scala akka-stream

我想了解akka流中的Keep.both,但在Internet上找不到简单的方法。

有人可以提供一个关于Keep.rightKeep.both的非常简单的示例。

我尝试过:

   implicit val system = ActorSystem("KafkaProducer")
    implicit val materializer = ActorMaterializer()

    val source = Source.single("Hello")_
    val sink = Sink.fold[String, String]("")(_ + _)

    val runnable: RunnableGraph[Future[String]] = source.toMat(sink)(Keep.left)
    runnable.run() 

我知道,这可能不是一个好例子,希望有人能提供一个更好的例子。

1 个答案:

答案 0 :(得分:0)

最简单的情况是,您需要一个流来处理要从流外部(1)提供的一堆元素,并且您需要知道(2)流何时完成对所有元素的处理。

对于(1),您可以使用实例化的Source.queue到队列中,然后可以通过offer将元素推送到该队列中。

val source = Source.queue[String](100,OverflowStrategy.backpressure)

对于(2),您可以使用实例化为Sink.foreach Future[Done],当到达流的正常末尾时将用Success完成或完成如果流中发出故障信号,请使用Failure

val sink = Sink.foreach[String](println)

然后,您需要连接源和接收器以及 Keep.both 物化值。

val materializedValues: (SourceQueueWithComplete[String], Future[Done]) = source.toMat(sink)(Keep.both).run()