Une approche est d'envoyer un message à self
à preStart
:
class MyActor extends Actor {
def preStart(): Unit = {
self ! CallService
}
def receive = {
case CallService =>
(service ? ServiceRequest).mapTo[ServiceResponse].pipeTo(self)
case ServiceResponse =>
// do something with the response
}
}
Comme décrit dans ce answer, si vous voulez que l'acteur pour envoyer le message avant qu'il traite tous les autres messages, vous pourriez stash
les autres messages:
class MyActor extends Actor with Stash {
def preStart(): Unit = {
self ! CallService
}
def uninitialized: Receive = {
case CallService =>
(service ? ServiceRequest).mapTo[ServiceResponse].pipeTo(self)
unstashAll()
context.become(initialized)
case _ => stash() // if we get a message other than CallService, stash it
}
def initialized: Receive = {
case ServiceResponse =>
// do something with the response from the service
case ...
}
def receive = uninitialized
}
Vous pouvez envoyer un message initial à votre acteur, qui déclenchera l'envoi du message de démarrage. Alternativement, faites de votre acteur un étatful; son état de démarrage enverrait le message et ensuite il passerait à l'état opérationnel, où il s'attendrait à recevoir la réponse. –
Merci @BobDalgleish - est-ce que cela implique un appel 'get (receive)' dans 'preStart'? –