【发布时间】:2017-04-29 00:16:36
【问题描述】:
我正在尝试了解 Akka 流的 Source 类型,指定为 here。
不幸的是,我找到的文档和示例并没有解释每个类型参数的实际含义。我猜Out 是源在具体化时发出的类型。那是对的吗?另一个类型参数Mat是什么?
【问题讨论】:
标签: scala akka akka-stream
我正在尝试了解 Akka 流的 Source 类型,指定为 here。
不幸的是,我找到的文档和示例并没有解释每个类型参数的实际含义。我猜Out 是源在具体化时发出的类型。那是对的吗?另一个类型参数Mat是什么?
【问题讨论】:
标签: scala akka akka-stream
出局
你是对的,这是Source发出的元素的类型。
垫子
这是Source的具体化类型。请注意,每个阶段(Flows、Sinks 等)也将具体化为一个值。
这本质上是舞台本身在运行之后的副产品。
您可以将其想象为在舞台运行时与舞台互动的一种方式。查看 Akka 提供的现成 Sources 示例是了解其要点的好方法。
Source.single 将实现为 NotUsed。您无法与源进行交互,因为它只会立即生成一个元素然后完成。
Source.queue 将实现为 SourceQueue。这是一个更有趣的案例,因为您可以通过offering 消息与源进行交互。您offer 的消息将由源发出。
Source.maybe 将实现为Promise。您可以使用Promise 来控制源并使其发出一个元素,或者None。
当您连接不同的阶段时,请注意每个阶段都可能具有有用的物化值。您可以使用viaMat/toMat 和Keep 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
【讨论】: