子アクターを作成して長い計算を実行するアクターがあります。
問題は、子アクターの初期化に数秒かかり、作成されてから完全に初期化されるまでの間に親アクターが子に送信するすべてのメッセージが破棄されることです。
これは私が使用しているコードのロジックです:
class ChildActor extends Actor {
val tagger = IntializeTagger(...) // this takes a few seconds to complete
def receive = {
case Tag(text) => sender ! tagger.tag(text)
case "hello" => println("Hello")
case _ => println("Unknown message")
}
}
class ParentActor extends Actor {
val child = context.ActorOf(Props[ChildActor], name = "childactor")
// the below two messages seem to get lost
child ! "hello"
child ! Tag("This is my sample text")
def receive = {
...
}
}
どうすればその問題を回避できますか? 子が完全に初期化されるまで親アクターを待機させることは可能ですか? 子アクターをルーティングで使用し、場合によってはリモート アクター システムで使用します。
編集
drexin のアドバイスに従って、コードを次のように変更しました。
class ChildActor extends Actor {
var tagger: Tagger = _
override def preStart() = {
tagger = IntializeTagger(...) // this takes a few seconds to complete
}
def receive = {
case Tag(text) => sender ! tagger.tag(text)
case "hello" => println("Hello")
case _ => println("Unknown message")
}
}
class ParentActor extends Actor {
var child: ActorRef = _
override def preStart() = {
child = context.ActorOf(Props[ChildActor], name = "childactor")
// When I add
// Thread.sleep(5000)
// here messages are processed without problems
// wihout hardcoding the 5 seconds waiting
// the below two messages seem to get lost
child ! "hello"
child ! Tag("This is my sample text")
}
def receive = {
...
}
}
しかし、問題は残ります。私は何が欠けていますか?