如何在Flow中使用确认语义?

时间:2018-06-19 11:00:56

标签: scala akka akka-stream

我想设计一个只在ActorRef收到一些确认消息时才从上游拉出的流。

我的用例是使用一些静态聚簇actor来完成工作。我有一个监护人,负责维护是否有可用的工人。当演员变得可用时,它将发布消息。我希望我的Flow能够意识到这个消息,以便将工作推向下游。否则,它会反压。

在阅读文档时,GraphStage API似乎没有一些被动组件,依赖于InHandler来进行自定义处理:

setHandler(in, new InHandler {
  override def onPush(): Unit = {
    println(grab(in))
    pull(in)
  }
})

我可能会在此方法中轮询有关可用actor数量的更新,但这不是被动的。

默认情况下,Akka是否支持流量确认?

1 个答案:

答案 0 :(得分:1)

不按推

一旦Actor空闲后,就不必再向上游发送流信号了,您可以让Source发送数据。

您可以创建一个将实现为ActorRef的源,该源将收到免费演员的通知:

object ActorIsFreeMessage

val source : Source[ActorIsFreeMessage, ActorRef] = Source.actorRef(???, ???)

然后,您可以附加一个Flow,一旦源收到消息,它将{pull a job}:

type Job = ???

val pullAJob : () => Job = ???

val jobFlow : Flow[ActorIsFreeMessage, Job] = 
  Flow[ActorIsFreeMessage].map[Job](_ => pullAJob())

val jobSource : Source[Job, ActorRef] = source via jobFlow

一旦此新Source附加到接收器,其他Actor就可以将消息发送到实例化的ActorRef

val jobSink : Sink[Job, ActorRef] = ???

val streamRef = jobSource.to(jobSink).run()

//inside of the Actor
streamRef ! ActorIsFreeMessage