我正在学习akka流,并在代码中遇到Keep.left和Keep.right:
implicit val system = ActorSystem("KafkaProducer")
implicit val materializer = ActorMaterializer()
val source = Source(List("a", "b", "c"))
val sink = Sink.fold[String, String]("")(_ + _)
val runnable: RunnableGraph[Future[String]] = source.toMat(sink)(Keep.right)
val result: Future[String] = runnable.run()
这里Keep.right是什么意思?
答案 0 :(得分:3)
每个流处理阶段都可以生成一个物化值,可以使用viaMat
或toMat
(分别与via()
或to()
相对)来捕获。在您的代码段中,使用source.toMat(sink)
表示您有兴趣捕获源和接收器的具体化值,Keep.right
保持物化值的右侧(即接收器)。 Keep.left
会将物化值保留在左侧(即来源),而Keep.both
则可以保留两者。
Akka Streams documentation的相关部分提供了更多详细信息。
答案 1 :(得分:1)
Keep.left
仅保留输入值的左(第一个)。 Keep.right
仅保留两个输入值的正确(第二个)。
答案 2 :(得分:0)
由于jvm确实进行了类型擦除,因此Akka在设计Stream时并不关心Source Flow Sink之间的类型,但是Source Flow Sink是类型化的类。 为了使类型在组件之间传递,您需要附加描述值,这是Keep的含义。 默认情况下,最终结果中的消息类型与最左边的Source,Keep.left()一致。您还可以将其设置为Keep.right()之类的其他内容。
严格来说,Keep指定值的类型,而不是值。 enter link description here
val r3: RunnableGraph[Future[Int]] = source.via(flow).toMat(sink)(Keep.right)
将“ Keep.right”更改为“ Keep left”:
val r3: RunnableGraph[Future[Int]] = source.via(flow).toMat(sink)(Keep.left)
会出现“类型不匹配”错误。