演员没有在`akka聚合器模式`文档中停止

时间:2014-02-23 16:21:25

标签: scala akka

我看了the aggregator pattern http://doc.akka.io/docs/akka/2.2.3/contrib/aggregator.html并在sample use case段中找到了一些内容

def fetchSavingsAccountsBalance() {
      context.actorOf(Props[SavingsAccountProxy]) ! GetAccountBalances(id)
      expectOnce {
        case SavingsAccountBalances(balances) ⇒
          results += (Savings -> balances)
          collectBalances()
      }
    }

我发现由context.actorOf创建的演员从未停止过,它应该是那样吗?

2 个答案:

答案 0 :(得分:2)

我相信停止聚合器演员是你自己的责任。来自文档:

The aggregator should terminate after the response is sent (or timed out). 

我正在解释这意味着停止是你自己的责任,而不是框架为你做的事情。我猜测,如果它确实停止了,那么文档就会说出以下内容:

The aggregator will terminate...

您还会注意到文档中的多个示例中都有context.stop的显式调用。此外,您给出的示例是链式聚合示例的一部分。在最终响应所有聚合数据并使用这段代码明确停止自身之前,它会执行大量单独的数据集合(链接在一起)。

def processFinal(eval: List[Int]) {
  // Select only the entries coming back from eval
  originalSender ! FinalResponse(eval map values)
  context.stop(self)
}

答案 1 :(得分:0)

默认情况下,演员不会自行关闭,除非您:

  • 停止演员系统context.system.shutdown()
  • 停止父演员或
  • 使用context.stop(self)明确停止该演员。

由于您使用聚合器模式,并且只有在处理完成后才能关闭整个actor系统,才需要收集结果。