【问题标题】:Akka Gotchas when dealing with Futures处理期货时的 Akka 陷阱
【发布时间】:2015-06-02 18:36:22
【问题描述】:

考虑以下代码位:

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 将如何阻止我刚刚描述的场景?

【问题讨论】:

    标签: akka future


    【解决方案1】:

    sender 实际上是一个函数(这就是为什么从 Akka 2.3 开始的约定是写成sender())。通过将该值绑定到originalSender,我们可以关闭该不可变值并知道它不会改变,即使在来自completeResult 的Future 完成之前收到另一条消息。

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

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多