class FooActor extends Actor {
def receive = {
case (x:FooRequest) => {
val x = database.runQuery("SELECT * FROM foo WHERE ", x)
val y = redis.get(x.fookey)
sender ! computeResponse(x,y)
}
}
}
<p class="indent">
在别的地方,FooActor是如下使用:
val fooResult: Future[Any] = fooActor ? FooRequest(...)
<p class="indent">
class FooRequester(system: ActorSystem) {
import system.dispatcher
def fooResult(x: FooRequest): Future[FooResponse] = Future {
val x = database.runQuery("SELECT * FROM foo WHERE ", x)
val y = redis.get(x.fookey)
computeResponse(x,y)
}
}
<p class="indent">
调用代码如下:
val fooResult: Future[FooResponse] = myFooRequester.fooResult(FooRequest(...))
<p class="indent">
这段使用future而不是Actor的好处是大大提高并发性。
如果我们使用Actor,考虑以下并发使用场景:
val r1 = fooActor ? request1
val r2 = fooActor ? request2
for {
result1 <- r1
result2 <- r2
} yield (combination(result1.asInstanceOf[FooResponse], result2.asInstanceOf[FooResponse]))
<p class="indent">