У меня есть актер, который создает дочерний актер для выполнения длинных вычислений.
Проблема в том, что инициализация дочернего актера занимает несколько секунд, и все сообщения, которые родительский актер отправляет ребенку между ним, создаются и полностью инициализируются, отбрасываются.
Это логика кода, который я использую:
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 = {
...
}
}
но проблема остается. Что мне не хватает?