【问题标题】:What do the type parameters to Source<Out,Mat> mean?Source<Out,Mat> 的类型参数是什么意思?
【发布时间】:2017-04-29 00:16:36
【问题描述】:

我正在尝试了解 Akka 流的 Source 类型,指定为 here

不幸的是,我找到的文档和示例并没有解释每个类型参数的实际含义。我猜Out 是源在具体化时发出的类型。那是对的吗?另一个类型参数Mat是什么?

【问题讨论】:

    标签: scala akka akka-stream


    【解决方案1】:

    出局

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

    垫子

    这是Source的具体化类型。请注意,每个阶段(Flows、Sinks 等)也将具体化为一个值。 这本质上是舞台本身运行之后的副产品。

    您可以将其想象为在舞台运行时与舞台互动的一种方式。查看 Akka 提供的现成 Sources 示例是了解其要点的好方法。

    • Source.single 将实现为 NotUsed。您无法与源进行交互,因为它只会立即生成一个元素然后完成。

    • Source.queue 将实现为 SourceQueue。这是一个更有趣的案例,因为您可以通过offering 消息与源进行交互。您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

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2011-05-13
      • 2017-05-09
      • 2016-08-28
      • 2012-02-21
      相关资源
      最近更新 更多