我有以下表格的可运行图表。
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
结束?或者也许有更好的方法来组织一些队列?
答案 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
}
)