1

Play 2.0 と Akka を使用して Web アプリケーションをデプロイしています。アクターは 1 回の 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

またはを呼び出すときはmap、実際にコールバックを登録しています。参照はコールバック クロージャでキャッチされますが、がメッセージを処理している間だけ適切に設定されます。FuturePromisesendersenderDeviceActor

メソッドが存在する前に、送信者の参照をキャプチャする必要があります。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 に答える