我想了解akka流中的Keep.both
,但在Internet上找不到简单的方法。
有人可以提供一个关于Keep.right
和Keep.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()
我知道,这可能不是一个好例子,希望有人能提供一个更好的例子。
答案 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()