2014-04-11 91 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的演員是不一樣的。