1

我正在使用 Play 2.0 和 Akka 部署 Web 应用程序。我根据职责分离了参与者,因为这些参与者通常需要在单个 Web 请求期间相互通信。

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

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
      }
  }

}

从我的控制器调用DeviceActor时,我总是得到

akka.pattern.AskTimeoutException
4

1 回答 1

6

调用mapa Futureor时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
      }
  }

}
于 2012-08-22T04:21:47.497 回答