2016-08-14 88 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