如何在播放中的演员之间传递回复!和阿卡

Jac*_*ter 1 scala akka playframework-2.0

我正在使用Play 2.0和Akka来部署Web应用程序.我根据责任分离了演员,因为演员经常需要在单个Web请求期间相互通信.

例如,给定一个管理注册设备的actor,它必须查询处理相关用户帐户的另一个actor:

class DeviceActor extends Actor {

  val accountActorRef = ...

  def receive = {
    case GetAccountByDeviceId(id:String) =>
      val accountId = getAccountIdAssociatedWithDevice(id)
      accountActorRef ? GetAccountById(accountId) map {
        case account: Account => sender ! account
      }
  }

}
Run Code Online (Sandbox Code Playgroud)

DeviceActor从我的控制器打电话时,我总是得到

akka.pattern.AskTimeoutException
Run Code Online (Sandbox Code Playgroud)

Jac*_*ter 6

在呼叫时map,Future或者Promise您实际上正在注册回叫.引用sender被捕获在回调闭包中,但sender只在DeviceActor处理消息时才适当设置.

您必须在方法存在之前捕获发件人引用receive:

class DeviceActor extends Actor {

  val accountActorRef = ...

  def receive = {
    case GetAccountByDeviceId(id:String) =>
      val X = sender
      val accountId = getAccountIdAssociatedWithDevice(id)
      accountActorRef ? GetAccountById(accountId) map {
        case account: Account => X ! account
      }
  }

}
Run Code Online (Sandbox Code Playgroud)