2013-03-18 55 views
1

我在Scala中使用Akka actors來並行處理隊列項目。我有一個擁有10個可重用子處理器動作者的MasterActor。Akka - 從終止的演員獲取信息

正在處理的項目可以是不同的類型,例如,紅色,藍色&綠色物品。在某一時刻,只能處理某種類型的單個項目。因此,如果正在處理一個紅色物品,則不能同時處理更多紅色物品。

一切都很好,但現在我嘗試爲應用程序實現良好的容錯能力,事實證明我無法獲得有關終止消息中的項目類型失敗的更多信息。如果ProcessorActor失敗,我需要在MasterActor中將適當的類型標記爲可供處理。現在我被卡住了,因爲我無法得到什麼項目類型失敗。我有一個終止消息中的ActorRef,但是afaiu在我收到消息後立即向它發送消息並不好。

最後,我可以留下所有可能的標記爲「正在處理」的類型,而實際上只是他們合適的演員已經死了。

請指教。

回答

0

好吧,我終於做了什麼,什麼似乎最好。我在ProcessorActor失敗中設置了重新啓動策略,並在其中處理preRestart方法。如果reason:Option[Any]不爲空並且與StartProcessingMessage(Item(ItemType))匹配,則我發送ProcessingFailedMessage(Item(ItemType))sender。然後主管演員將類型標記爲未處理,接下來while循環將啓動一些ProcessorActor的處理,甚至可能是失敗並剛剛重新啓動的處理。

1

Terminated設置了一些'暫停'標誌,不向兒童提供新作業,然後在所有ProcessorActors中ping所有ProcessorActors,如果有任何作業可以分配 - 分配作業並釋放'暫停'標誌。如果在設置「暫停」標誌時收到終止消息,請再次ping。

+0

好吧,但這並不能解決識別什麼工作失敗的問題。我怎樣才能得到被終止的具體演員?我有終止消息中的ActorRef,但它不允許通過該引用獲取真正的ProcessorActor。 – 2013-03-19 07:18:02

+1

雖然我的主要設計觀點是不同時允許2個綠色工作。你可以在ping上計算作業,並分配剩餘的內容 - 例如,你有1個藍色1個綠色1個紅色。藍色失敗,然後在終止處理過程中綠色似乎已經完成 - 分配藍色和綠色,忽略來自綠色的下一條消息...考慮具體的「ProcessorActor」 - 你沒有在Akka中,任何具體的角色,特別是遠程角色 - 通過消息。 – idonnie 2013-03-19 10:33:24

0

您的ProcessorActor可以在開始處理該項目之前,向MasterActor發送消息(包含該項目的類型)。在您的MasterActor中,您可以維護Map[ActorRef, ItemType],您可以通過ActorRef(在Terminated消息中收到)確定當ProcessorActor死亡時正在處理的最後一個項目類型。

1

看起來你想要做的事情可以通過重新設計你的架構來獲得,讓他有一個紅色演員,一個藍色演員和一個綠色演員,並將監督策略設置爲對演員失敗重啓,而不是停止。真的很簡單。無需自己處理終止消息。

+1

很好的選擇,雖然類型的數量沒有預先定義,並且會在程序運行時更改。 – 2013-03-20 08:49:38