等待ClosedShape流完成

时间:2017-12-01 18:41:52

标签: scala akka akka-stream

我有以下表格的可运行图表。

def getGraph[T](sequence: Seq[T], tickConsumers: Map[T, ActorRef]) =
  RunnableGraph.fromGraph(
    GraphDSL.create() { implicit builder =>
      val ticker = builder.add(new SomeTickProducer))
      val broadcast = builder.add(Broadcast[T](sequence.length))
      ticker ~> broadcast
      sequence.foreach { item =>
        broadcast ~>
        builder.add(new SomeTickProcesser(item)) ~>
        Sink.actorRef(tickConsumers(item), NotUsed)
      }
      ClosedShape
    }
  )

所以我的图表已关闭且不会生成任何数据,我无法实现。实际上,它只是从外部服务接收一些数据,处理它们并向几个消费者广播。

SomeTickProducer为外部服务创建非常重要的负载而言,我应该不再运行一次这样的图表。有没有办法将我的图表转换为Future - 并且等待它使用Await结束?或者也许有更好的方法来组织一些队列?

1 个答案:

答案 0 :(得分:2)

要使图表具体化未来,您需要为GraphDSL.create方法提供一个这样做的阶段,例如Sink.ignore。然后,您将从GraphDSL构建器中访问该阶段。

假设SomeTickProducer是最终完成的Source,您可以关注SomeTickProducer的终止并将其转发到图表的插座。

然后,当您实现图表时,它将是Future[Done]类型。

这可以像:

def getGraph[T](sequence: Seq[T], tickConsumers: Map[T, ActorRef]) =
  RunnableGraph.fromGraph(
    GraphDSL.create(Sink.ignore) { implicit builder => out =>
      val producer = new SomeTickProducer
      val ticker = builder.add(producer)
      val broadcast = builder.add(Broadcast[T](sequence.length))
      ticker ~> broadcast
      sequence.foreach { item =>
        broadcast ~>
        builder.add(new SomeTickProcesser(item)) ~>
        Sink.actorRef(tickConsumers(item), NotUsed)
      }
      producer.watchTermination()(Keep.none) ~> out
      ClosedShape
    }
  )