Akka Streams:No-arg GraphDSL.create()vs GraphDSL.create(sink)

时间:2016-08-20 21:15:55

标签: scala akka reactive-programming akka-stream

doc有以下示例(仅显示与我的问题相关的内容):

val resultSink = Sink.head[Int]

val g = RunnableGraph.fromGraph(GraphDSL.create(resultSink) { implicit b => sink =>
  import GraphDSL.Implicits._

  // importing the partial graph will return its shape (inlets & outlets)
  val pm3 = b.add(pickMaxOfThree)

  Source.single(1) ~> pm3.in(0)
  Source.single(2) ~> pm3.in(1)
  Source.single(3) ~> pm3.in(2)
  pm3.out ~> sink.in
  ClosedShape
})

我很好奇为什么必须将接收器作为参数传递给GraphDSL.create所以我稍微修改了示例

val resultSink = Sink.head[Int]

val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit b =>
  import GraphDSL.Implicits._

  // importing the partial graph will return its shape (inlets & outlets)
  val pm3 = b.add(pickMaxOfThree)
  val s = b.add(resultSink).in

  Source.single(1) ~> pm3.in(0)
  Source.single(2) ~> pm3.in(1)
  Source.single(3) ~> pm3.in(2)

  pm3.out ~> s

  ClosedShape
})

但是,这会将g.run()的返回类型从Future[Int]更改为akka.NotUsed。为什么呢?

1 个答案:

答案 0 :(得分:3)

我想我自己找到了答案。加。到文档:

  

使用builder.add(...),这个操作将复制   传递给它并返回其入口和出口的蓝图   生成的副本,以便它们可以连接起来。另一种选择   是将任何形状的现有图形传递到工厂方法中   生成一个新图。这些方法之间的区别在于   使用builder.add(...)导入忽略了物化的值   通过工厂方法导入时导入的图形允许它   夹杂物

g.run返回图表的具体化值,从而返回返回类型的变化。