2011-08-31 36 views
2

我對演員模型頗爲陌生,這就是爲什麼我認爲已經建立了模式來解決我的常見問題,演員和期貨等美麗的可組合抽象。如何使用actors來實現異步相互獨立的可取消操作?

我有異步操作符合下列要求:

  • 他們通過發送一個低級別的請求,然後監測實體的狀態輪詢使用遺留系統。因此,實際操作的結果只能以延遲方式提供,當觀察狀態達到所需狀態時,必須通知請求者。
  • 這些操作只有在一些其他操作完成後才能發出,這些操作應該並行等待。
  • 操作可以取消。當然,已經發布的低層請求不能被撤銷;取消意味着在我們依賴完成的操作完成後不發出實際操作,當然這必須以遞歸方式傳播(如果我們等待依賴關係,並且它有多個掛起操作,請不要發佈它們)。

我在期貨中的想法:第一個要求可以通過例如, Akka的map/flatMap,第二個與traverse組合器沒有依賴程序地維護/依賴。但我想不出取消的解決方案;期貨不能取消,如果組成,他們的組成部分是不可及的。如何封裝「取消當前操作」以功能的方式? Scala的任何Actor框架是否支持這個?

+0

爲什麼這個問題只有1個投票超出了我的理解。近3年後,仍然沒有很好的答案。 – axiopisty

回答

3

使用監聽器:https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/Listeners.scala

請使用監聽器輪詢的狀態傳播到任何和所有聽衆的演員。然後,您可以使用消息傳遞循環來重新啓動輪詢。

class MyActor extends Actor with Listeners { 

    override def preStart { 
    self ! 'poll //Start looping on start 
    } 

    def receive = listenerManagement orElse { 
    case 'poll => val result = pollYourExternalDude() 
    gossip(result) 
    self ! 'poll //Loop 
    } 
} 

然後,您可以停止使用停止或發送PoisonPill的演員。

這有幫助嗎?

+0

謝謝你的指示,同時我更深入地研究了Akka文檔,並相應地編輯了這個問題。期貨和創作他們是偉大的,但仍然沒有解決取消。如果我必須手動維護聽衆,我會選擇這種方式。 – thSoft

+0

如果你只使用期貨,你可以有一個表示取消的期貨,所以如果它已經完成取消,那麼在你做計算時檢查一下。 –