У меня есть актер, который создает дочерний актер для выполнения длительных вычислений.Как справиться с длительной инициализацией актера Акки?
Проблема заключается в том, что инициализация дочернего актера занимает несколько секунд, и все сообщения, которые родительский актер посылает ребенку между ним, создаются и полностью инициализируются, отбрасываются.
Это логика кода, который я использую:
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 = {
...
}
}
Как я могу обойти эту проблему? Можно ли заставить родительского актера ждать, пока ребенок полностью инициализируется? Я буду использовать дочернего актера с маршрутизацией и, возможно, на удаленных актерских системах.
EDIT
Следуя совету 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 = {
...
}
}
, но проблема остается. Что мне не хватает?
Какую версию Акку вы используете. У меня проблемы с имитацией проблемы. Кажется, все отлично работает для меня. – cmbaxter
@cmbaxter: Я использую akka 2.2-M2. – twowo