2016-08-14 87 views
0

我希望可以问这个问题。我正在使用阿卡,并且有两个演员,其中一个快速启动/创建,另一个慢得多。快速创建的人向另一个人请求(ask-pattern),并且该消息被发送到死信,因为另一个尚未启动。让演员等待发送消息的首选方式是什么?如果不知道没有别的办法,我并不急于让演员睡觉或是什么。如何避免发送消息给未创建的演员?

回答

1

我会使用功能become()/unbecome() Akka为演员提供。我在下面的代码中假设slowActorfastActor创建。这里的技巧是,fastActor将有两种行为:一种是当slowActor正在启动时,另一种是当它准备好做一些工作时。当slowActor准备就绪后,它会发送一条消息给fastActor来宣传可以接收消息。 fastActorwatch ing slowActor,如果它终止,它会再次改变它的行为。接下来做什么将取决于您的解决方案。

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

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 
    } 
} 
+0

感谢。这可能很有趣,但是慢镜头是迄今为止快速演员的兄弟。 – stian