我正在尝试了解指定here的Akka流的源类型。
不幸的是,我发现的文档和示例并未解释每个类型参数的实际含义。我猜测Out
是源在物化时发出的类型。那是对的吗?什么是其他类型参数Mat
?
答案 0 :(得分:6)
<强>退出
你是对的,这是Source
发出的元素的类型。
<强>垫强>
这是Source
的实现类型。请注意,每个阶段(Flow
s,Sink
等)也会实现一个值。
这基本上是舞台本身在运行之后的副产品。
你可以将它描绘成在舞台运行时与舞台互动的意思。查看Akka提供的现成Source
的示例是获得它的要点的好方法。
Source.single
将实现NotUsed
。你没有意义与源相互作用,因为它只会立即产生一个元素然后完成。
Source.queue
将实现SourceQueue
。这是一个更有趣的案例,因为您可以通过offer
消息与源进行交互。您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