处理 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 的新本地值。