我想设计一个只在ActorRef
收到一些确认消息时才从上游拉出的流。
我的用例是使用一些静态聚簇actor来完成工作。我有一个监护人,负责维护是否有可用的工人。当演员变得可用时,它将发布消息。我希望我的Flow能够意识到这个消息,以便将工作推向下游。否则,它会反压。
在阅读文档时,GraphStage
API似乎没有一些被动组件,依赖于InHandler
来进行自定义处理:
setHandler(in, new InHandler {
override def onPush(): Unit = {
println(grab(in))
pull(in)
}
})
我可能会在此方法中轮询有关可用actor数量的更新,但这不是被动的。
默认情况下,Akka是否支持流量确认?
答案 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