Scala 如何获取FlowShape中连接的入口和出口实例?

Scala 如何获取FlowShape中连接的入口和出口实例?,scala,akka,akka-stream,Scala,Akka,Akka Stream,如何在FlowShape中获取已连接的入口和出口的实例?考虑下面的例子 def throttleFlow[T](rate: FiniteDuration) = Flow.fromGraph(GraphDSL.create() { implicit builder => import GraphDSL.Implicits._ val ticker = Source.tick(rate, rate, Unit) val zip = builder.add(Zip[T, Unit

如何在
FlowShape
中获取已连接的
入口
出口
的实例?考虑下面的例子

def throttleFlow[T](rate: FiniteDuration) = Flow.fromGraph(GraphDSL.create() { implicit builder =>
  import GraphDSL.Implicits._

  val ticker = Source.tick(rate, rate, Unit)

  val zip = builder.add(Zip[T, Unit.type])
  val map = Flow[(T, Unit.type)].map { case (value, _) => value }
  val messageExtractor = builder.add(map)

  val in = Inlet[T]("Req.in")
  val out = Outlet[T]("Req.out")

  out ~> zip.in0
  ticker ~> zip.in1
  zip.out ~> messageExtractor.in

  FlowShape.of(in, messageExtractor.out)
})
当我在
Source.via()中使用它时,我得到以下异常

Caused by: java.lang.IllegalArgumentException: requirement failed: The output port [Req.out] is not part of the underlying graph.
    at scala.Predef$.require(Predef.scala:219)
    at akka.stream.impl.StreamLayout$Module$class.wire(StreamLayout.scala:204)

我缺少什么?

入口和出口的
没有连接到任何东西。这就是为什么会出现异常(不幸的是,这种问题只能在运行时检测到)

您需要一个流,其中唯一打开的入口是一个zip入口(
zip.in0
,因为
zip.in1
连接到股票行情器),唯一打开的出口是messageExtractor的输出,那么这样如何:

def throttleFlow[T](rate: FiniteDuration) = Flow.fromGraph(GraphDSL.create() { implicit builder =>
  import GraphDSL.Implicits._

  val ticker = Source.tick(rate, rate, ())

  val zip = builder.add(Zip[T, Unit])
  val map = Flow[(T, Unit)].map { case (value, _) => value }
  val messageExtractor = builder.add(map)

  ticker ~> zip.in1
  zip.out ~> messageExtractor.in

  FlowShape.of(zip.in0, messageExtractor.out)
})

啊,我明白了。所以返回的FlowShape定义了连接。谢谢!仅供参考,它按照Akka 2.4.9的预期编译和工作。谢谢