考虑以下代码位:
def receive = {
case ComputeResult(itemId: Long) =>
//val originalSender = sender
computeResult(itemId).map { result =>
originalSender ! result
}
}
computeResult导致Future,那么val的引入如何阻止我将结果发送给错误的发送者?让我们说我有一个完全不同的发件人(sender1和sender2)。
Sender1首先发送一条消息,然后发送Sender2。如果没有我上面的方法中的val,我清楚地看到我的Sender2有可能得到实际上对Sender1有意义的结果。
我没有得到的是,如果引入一个val会阻止我进入我刚刚描述的场景?
答案 0 :(得分:0)
sender
实际上是一个函数(这就是为什么Akka 2.3以后的约定是写sender()
)。通过将值绑定到originalSender
,我们可以关闭该不可变值并知道它不会更改,即使在completeResult
的Future之前另一条消息进入也是如此。
因为receive
是一个函数,所以每次调用都会产生一个名为originalSender
的新本地值。