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)
在呼叫时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)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |