处理 Futures 时的 Akka Gotchas
Akka Gotchas when dealing with Futures
考虑以下代码位:
def receive = {
case ComputeResult(itemId: Long) =>
//val originalSender = sender
computeResult(itemId).map { result =>
originalSender ! result
}
}
computeResult 产生了 Future,那么引入 val 如何防止我将结果发送给错误的发送者?假设我有一个完全不同的发件人(发件人 1 和发件人 2)。
发件人 1 先发送消息,然后发件人 2。在我上面的方法中没有 val,我清楚地看到我的 Sender2 有可能得到实际上是为 Sender1 准备的结果。
我不明白的是,val 的引入如何阻止我出现刚才描述的情况?
sender
实际上是一个函数(这就是为什么从 Akka 2.3 开始的约定是写 sender()
)。通过将值绑定到 originalSender
,我们可以关闭该不可变值并知道它不会更改,即使在来自 completeResult
的 Future 完成之前收到另一条消息也是如此。
因为 receive
是一个函数,所以每次调用都会产生一个名为 originalSender
的新本地值。
考虑以下代码位:
def receive = {
case ComputeResult(itemId: Long) =>
//val originalSender = sender
computeResult(itemId).map { result =>
originalSender ! result
}
}
computeResult 产生了 Future,那么引入 val 如何防止我将结果发送给错误的发送者?假设我有一个完全不同的发件人(发件人 1 和发件人 2)。
发件人 1 先发送消息,然后发件人 2。在我上面的方法中没有 val,我清楚地看到我的 Sender2 有可能得到实际上是为 Sender1 准备的结果。
我不明白的是,val 的引入如何阻止我出现刚才描述的情况?
sender
实际上是一个函数(这就是为什么从 Akka 2.3 开始的约定是写 sender()
)。通过将值绑定到 originalSender
,我们可以关闭该不可变值并知道它不会更改,即使在来自 completeResult
的 Future 完成之前收到另一条消息也是如此。
因为 receive
是一个函数,所以每次调用都会产生一个名为 originalSender
的新本地值。