Akka演员意外地清理了它的状态

时间:2014-04-11 21:40:17

标签: java akka actor

我有{{3>}参与 parallel-word-count-calculation 的演员。

它有一个州:

private Map<String, Integer> wordCountMap = new HashMap<String, Integer>();

收到WordCountMapMessage消息时,它将状态更改为9 elements

{over=1, fell=1, fox=1, quick=1, tried=1, brown=1, lazy=1, dog=2, jump=1}

this main class为此 - 如果您启动它,您可以看到输出)

然后当它收到ResultMessage时,wordCountMap为空。

问:为什么突然间它有空地图/状态?

这可能是Actor在没有消息传递的情况下以某种方式重新初始化其状态吗?

- 的更新 如果我在preStart中删除方法AggregateWordCountActor,那么我可以看到这样的输出:

  

预启动预启动预启动预启动预启动

好像它开始了5次!但它不会启动任何preRestart

2 个答案:

答案 0 :(得分:1)

  

好像它开始了5次!但它没有启动任何preRestart

那是因为你正在使用withRouter(new RoundRobinPool(5)) - 它创建了5个将以循环方式接收消息的角色。

问题是你收到的演员的状态比完成计算要多:收到WordCountMapMessageResultMessage的演员不一样。

答案 1 :(得分:1)

您的问题似乎是您正在为RoundRobinPool演员中的每个儿童演员使用Master。因为您的子actor是有状态的,当请求进入请求当前状态时,它会转到另一个actor实例,然后是接收处理单词请求的实例(通过循环路由逻辑)。从Master actor中的子actor创建中删除路由器,你的代码应该可以工作。