我有{{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
答案 0 :(得分:1)
好像它开始了5次!但它没有启动任何preRestart
那是因为你正在使用withRouter(new RoundRobinPool(5))
- 它创建了5个将以循环方式接收消息的角色。
问题是你收到的演员的状态比完成计算要多:收到WordCountMapMessage
和ResultMessage
的演员不一样。
答案 1 :(得分:1)
您的问题似乎是您正在为RoundRobinPool
演员中的每个儿童演员使用Master
。因为您的子actor是有状态的,当请求进入请求当前状态时,它会转到另一个actor实例,然后是接收处理单词请求的实例(通过循环路由逻辑)。从Master
actor中的子actor创建中删除路由器,你的代码应该可以工作。