合理複雜度的任何狀態機都需要在進入狀態時執行一些輸入操作。例如,UML狀態機圖對此有特殊的操作。不幸的是,我不明白我可以如何在Akka FSM中建模這樣的入口動作(或退出動作)。由於條目操作旨在改變狀態數據(例如,準備在新狀態下操作所需的數據結構),所以對轉換執行操作(使用下劃線外出狀態)不起作用。有關如何在Akka FSM中對進入/退出行爲建模的任何建議?Akka FSM的輸入操作
回答
我有同樣的問題,我玩了一段時間修改原來的FSM特性來處理進入/退出。
https://github.com/jock71/jock-akka-fsm/blob/master/src/main/scala/jok/akka/fsm/FsmMod.scala
的使用例子,可以發現:
https://github.com/jock71/jock-akka-fsm/blob/master/src/main/scala/jok/akka/fsm/TestAkkaFsm.scala
不是很清楚,我都在使用goto語句中指定,並在進入處理程序改變時如何處理StateData
如果要爲某個州添加進入或退出操作,您需要在onTransition上寫一些PartialFunction。
例如,這是怎麼AkkaFSM您模式進入或退出動作:
onTransition {
case _ -> StateA => /* This is an entry action for StateA. Do something here. You can send messages to actors (or self), so some state checks or setups. */
case StateA -> _ => /* This is an exit action for StateA. Do something here. You can send messages to actors (or self), so some state post-checks or any cleanup task for the state */
}
這個問題明確地涉及到這個選項,並解釋了爲什麼它是不夠的 - 不可能改變狀態數據。 –
我想我誤解了你的問題,因爲我以爲你只是想對狀態本身或actor中的某些局部變量執行檢查或操作,而不是數據本身。即使是錯誤的,我也會留下答案,因爲它回答了題目中的問題。 –
本書Akka in Action也使用entry actions from UML。他們使用帶通配符的轉換實現輸入操作,並使用外部事件來更改狀態(但不是狀態數據)。
有一個完整的scala example on github。在Scala中的一部分:
onTransition {
case _ -> WaitForRequests => {
if (!nextStateData.pendingRequests.isEmpty) {
// go to next state
self ! PendingRequests
}
}
或翻譯成Java:
onTransition(
matchState(null, WaitForRequests.class,() -> {
if (!nextStateData().pendingRequests.isEmpty()) {
// go to next state
self().tell(PendingRequests, self());
}
}
})
如阿卡的FSM documentation指出,初步currentState -> currentState
通知將被觸發[調用initialize
後。
像這樣的東西應該工作:
onTransition {
case InitialState -> InitialState =>
// Do stuff
}
- 1. 未來的Akka FSM Goto
- 2. 在輸入操作?
- 3. toolStripTextBox操作輸入
- 4. 輸入/輸出操作 - ML
- 5. AKKA FSM:消息沒有正確傳遞給FSM參與者參考
- 6. 如何使用FSM-s來表示Akka actor正在長時間運行的操作
- 7. 爲什麼我的Akka FSM事件超時?
- 8. 可能與Akka FSM中收到的多條消息匹配
- 9. Akka FSM通過非時間測量的「超時」(斯卡拉)
- 10. 一些演員消息的丟失--AKKA FSM
- 11. JQuery輸入焦點操作
- 12. MVC輸入操作方法
- 13. 操作輸入複選框
- 14. 測試Akka輸入的行爲
- 15. RISC-V ISA輸入和輸出操作
- 16. Akka FSM vs Storm用於媒體內容呈現應用程序
- 17. 如何在Akka FSM轉換期間訪問狀態
- 18. Akka FSM計時器停止發送消息
- 19. 如何將輸入作爲操作
- 20. 操作與jQuery的無線輸入
- 21. Cakephp的HTML樣式輸入操作
- 22. IOS:用iPad的輸入鍵操作KeyBoard
- 23. mapreduce中加入操作的輸出
- 24. FSM機器在VHDL中與每個狀態做某些操作
- 25. VHDL FSM設置單元輸入和使用相同狀態的輸出
- 26. 在FSM
- 27. SearchView監聽輸入法操作
- 28. 在C中操作struct - 輸入變量
- 29. Fhir - 數據輸入操作員/審計
- 30. java gui swing用戶輸入操作
通過進入/退出動作你的意思是演員開始或停止演員之後之前執行的動作?或者你的意思是對狀態轉換有副作用?我認爲你的問題不夠乾淨。 –
狀態機術語中的輸入動作是在進入狀態時執行的功能。與演員停止/開始生命週期無關。 –
我明白了。你爲什麼不使用'goto(NewState).using(newData)'語法來改變狀態數據? –