当在演员内部调用时,是否可以从 returns 一个值的方法中获取值?
Is it possible to get the value from a method that returns a value, when called inside an 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
是一个模型 class,带有一个名为 Service
的 object
,它具有 create
方法。
此 create
方法 return 是 Future[String]
。因此,当我尝试从演员调用此创建方法时,是否可以将来自演员的 return Future[String]
作为消息存储到演员外部的变量中?
这里似乎有两个问题:如何从 Future
生成消息以及如何从 actor 系统“输出”消息。
第一个问题的答案是在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
}
请注意,答案将异步出现在单独的线程中,因此在处理此类回复时需要小心。有关询问的更多详细信息,请参阅 here。
我有这样定义的演员
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
是一个模型 class,带有一个名为 Service
的 object
,它具有 create
方法。
此 create
方法 return 是 Future[String]
。因此,当我尝试从演员调用此创建方法时,是否可以将来自演员的 return Future[String]
作为消息存储到演员外部的变量中?
这里似乎有两个问题:如何从 Future
生成消息以及如何从 actor 系统“输出”消息。
第一个问题的答案是在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
}
请注意,答案将异步出现在单独的线程中,因此在处理此类回复时需要小心。有关询问的更多详细信息,请参阅 here。