2014-04-11 88 views
0

我有this演员参与并行字数计算Akka演员意外清除其状态

它的状态:

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} 

there ismain class为 - 如果你可以看到输出你启动它)

然后当它收到ResultMessage,然后wordCountMap是空的。

问:怎么会,突然它有空的地图/状态?

演员是否有可能以某种方式重新初始化其状态而没有消息通过?

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

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

它似乎开始5次!但它并没有推出preRestart

+0

如果失败并且由其主管重新启动,此actor将初始化其状态。是否有可能导致未重新捕获的异常被重启?如果您覆盖preRestart并打印某些内容,您可以看到是否重新启动。 – cmbaxter

+0

我做到了。 preRestart永远不会被调用。 – ses

回答

1

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

+0

非常像ejb无状态豆和它的游泳池。 – ses

1

它似乎开始5次!但它不会启动任何preRestart

这是因为您正在使用withRouter(new RoundRobinPool(5)) - 它创建5个角色,以循环方式接收消息。

问题是你正在接收不同演员的状态,而不是完成计算:将会收到WordCountMapMessageResultMessage的演员是不一样的。