0
我希望可以問這個問題。我正在使用阿卡,並且有兩個演員,其中一個快速啓動/創建,另一個慢得多。快速創建的人向另一個人請求(ask-pattern),並且該消息被髮送到死信,因爲另一個尚未啓動。讓演員等待發送消息的首選方式是什麼?如果不知道沒有別的辦法,我並不急於讓演員睡覺或是什麼。如何避免發送消息給未創建的演員?
我希望可以問這個問題。我正在使用阿卡,並且有兩個演員,其中一個快速啓動/創建,另一個慢得多。快速創建的人向另一個人請求(ask-pattern),並且該消息被髮送到死信,因爲另一個尚未啓動。讓演員等待發送消息的首選方式是什麼?如果不知道沒有別的辦法,我並不急於讓演員睡覺或是什麼。如何避免發送消息給未創建的演員?
我會使用功能become()/unbecome()
Akka爲演員提供。我在下面的代碼中假設slowActor
由fastActor
創建。這裏的技巧是,fastActor
將有兩種行爲:一種是當slowActor
正在啓動時,另一種是當它準備好做一些工作時。當slowActor
準備就緒後,它會發送一條消息給fastActor
來宣傳可以接收消息。 fastActor
將watch
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
}
}
感謝。這可能很有趣,但是慢鏡頭是迄今爲止快速演員的兄弟。 – stian