Keep in akka stream是什么意思?

时间:2017-11-04 22:42:54

标签: scala akka-stream

我正在学习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是什么意思?

3 个答案:

答案 0 :(得分:3)

每个流处理阶段都可以生成一个物化值,可以使用viaMattoMat(分别与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)

会出现“类型不匹配”错误。