Source <out,mat>的类型参数是什么意思?

时间:2016-12-13 19:57:54

标签: scala akka akka-stream

我正在尝试了解指定here的Akka流的源类型。

不幸的是,我发现的文档和示例并未解释每个类型参数的实际含义。我猜测Out是源在物化时发出的类型。那是对的吗?什么是其他类型参数Mat

1 个答案:

答案 0 :(得分:6)

<强>退出

你是对的,这是Source发出的元素的类型。

<强>垫

这是Source的实现类型。请注意,每个阶段(Flow s,Sink等)也会实现一个值。 这基本上是舞台本身运行之后的副产品。

你可以将它描绘成在舞台运行时与舞台互动的意思。查看Akka提供的现成Source的示例是获得它的要点的好方法。

  • Source.single将实现NotUsed。你没有意义与源相互作用,因为它只会立即产生一个元素然后完成。

  • Source.queue将实现SourceQueue。这是一个更有趣的案例,因为您可以通过offer消息与源进行交互。您offer的消息将由消息来源发出。

  • Source.maybe将实现Promise。您可以使用Promise来控制来源并使其发出一个元素,或None

当您连接不同的阶段时,请注意每个阶段都可能具有有用的物化价值。您可以使用viaMat / toMatKeep DSL来选择要保留的内容。 在组合图上调用run()时,将返回一个或多个具体化值。

查看以下示例中的类型是获取API要点的最佳方式:

  val source: Source[Int, MatSrc]
  val sink: Sink[Int, MatSnk]

  val matSrc: MatSrc = source.toMat(sink)(Keep.left).run()
  val matSnk: MatSnk = source.toMat(sink)(Keep.right).run()
  val (m1: MatSrc, m2: MatSnk) = source.toMat(sink)(Keep.both).run()
  val n: NotUsed = source.toMat(sink)(Keep.none).run()

请注意,在许多示例中您可以找到的更简洁的DSL实际上是上述的快捷方式,其中仅保留最后一级(例如接收器)的具体化值。

  val mat3: Mat3 = source.viaMat(flow)(Keep.right).toMat(sink)(Keep.right).run()

相同
  val mat3: Mat3 = source.via(flow).runWith(sink)

请参阅下面的文档以进一步阅读。

http://doc.akka.io/docs/akka/2.4/java/stream/stream-quickstart.html#Materialized_values