Akka Gotchas在与Futures打交道时

时间:2015-06-02 18:36:23

标签: akka future

考虑以下代码位:

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会阻止我进入我刚刚描述的场景?

1 个答案:

答案 0 :(得分:0)

sender实际上是一个函数(这就是为什么Akka 2.3以后的约定是写sender())。通过将值绑定到originalSender,我们可以关闭该不可变值并知道它不会更改,即使在completeResult的Future之前另一条消息进入也是如此。

因为receive是一个函数,所以每次调用都会产生一个名为originalSender的新本地值。