如何避免向尚未创建的演员发送消息?

时间:2016-08-14 22:00:23

标签: akka

我希望可以问这个问题。我正在使用akka并且有两个演员,其中一个是快速启动/创建的,另一个则慢得多。快速创建的一个要求另一个人(问题模式),并且消息被发送到死信,因为另一个尚未启动。让演员等待发送消息的首选方法是什么?我不是那么渴望让一个演员睡不着觉而不知道没有别的办法。

1 个答案:

答案 0 :(得分:1)

我会使用Akka为Actors提供的功能become()/unbecome()。我假设在以下代码中slowActorfastActor创建。这里的诀窍是fastActor将有两种行为:一种用于slowActor何时开始,另一种用于何时准备开始工作。当slowActor准备好后,它会向fastActor发送一条消息,宣传能够接收消息的消息。 fastActor watchslowActor case object Ready case object DoWork case object WorkDone class FastActor extends Actor with ActorLogging { val slowActor = context.actorOf(SlowActor.props) context.watch(slowActor) def receive = slowActorNotReadyBehavior def slowActorNotReadyBehavior = { case DoWork => log.warning("Slow actor in not ready, I am sorry...") case Ready => context.become(slowActorReadyBehavior) } def slowActorReadyBehavior = { case DoWork => (slowActor ? DoWork).pipeTo(self) case Terminated(ref) => log.error("Slow actor terminated") context.unbecome() //... do something with slowActor } } class SlowActor extends Actor { override def preStart = { context.parent ! Ready } def receive = { case DoWork => //do something sender ! WorkDone } } ,如果它被终止,它将再次改变其行为。接下来该做什么取决于你的解决方案。

这是一个模拟代码作为指南(我没有编译代码,它可能包含一些错误):

driver.get(r"http://www.python.org")