有可能获取值的方法返回一个值,调用时在一个演员?



我有一个这样定义的actor

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是一个模型类,其object称为Service,具有create方法。这个create方法返回一个Future[String]。因此,当我试图从演员调用这个创建方法时,是否有可能从演员返回Future[String]作为可以存储到演员外部变量的消息?

这里似乎有两个问题:如何从Future生成消息以及如何获得消息"输出";

第一个问题的答案是在Future上使用onComplete:
accounts.Service.create(address, username, type, password).onComplete{
case Success(account) =>
otherActor ! AccountCreated(account)
case Failure(e) =>
otherActor ! CreateAccountFailed(address, username, type)
}

这将在Future完成(成功或错误)时发送适当的消息。

第二个问题的答案是使用ask模式,该模式允许从参与者系统外部向参与者发送消息并接收回复:

(RandomActor ? RequestMessage).mapTo[ReplyType].onComplete {
case Success(reply) =>
// process reply
case Failure(e) =>
// process error
}

请注意,答案将异步地出现在一个单独的线程上,因此在处理这类回复时需要小心。有关ask的详细信息,请参阅此处。

最新更新