I have an actor defined like this
class RandomActor @Inject() (
accounts: models.Accounts
)extends Actor with ActorLogging{
override def receive: Receive = {
case Create(address, username, type, password) => {
accounts.Service.create(address, username, type, password)
}
}
}
Accounts is a model class with an object called Service which has the create method.
This create method returns a Future[String]. So when I'm trying to call this create method from an actor, is it possible to return the Future[String] from the actor as a message which can be stored into a variable outside an actor?
CodePudding user response:
There seem to be two questions here: How to generate a message from a Future and how to get a message "out" of the actor system.
The answer to the first question is to use onComplete on the Future:
accounts.Service.create(address, username, type, password).onComplete{
case Success(account) =>
otherActor ! AccountCreated(account)
case Failure(e) =>
otherActor ! CreateAccountFailed(address, username, type)
}
This will send the appropriate message when the Future completes (either successfully or with an error).
The answer to the second question is to use the ask pattern that allows a message to be sent to an actor from outside the actor system and a reply received:
(RandomActor ? RequestMessage).mapTo[ReplyType].onComplete {
case Success(reply) =>
// process reply
case Failure(e) =>
// process error
}
Note that the answer will appear asynchronously on a separate thread, so care is needed when processing this sort of reply. See here for more details on ask.
