2015-09-10 89 views
2

合理複雜度的任何狀態機都需要在進入狀態時執行一些輸入操作。例如,UML狀態機圖對此有特殊的操作。不幸的是,我不明白我可以如何在Akka FSM中建模這樣的入口動作(或退出動作)。由於條目操作旨在改變狀態數據(例如,準備在新狀態下操作所需的數據結構),所以對轉換執行操作(使用下劃線外出狀態)不起作用。有關如何在Akka FSM中對進入/退出行爲建模的任何建議?Akka FSM的輸入操作

+0

通過進入/退出動作你的意思是演員開始或停止演員之後之前執行的動作?或者你的意思是對狀態轉換有副作用?我認爲你的問題不夠乾淨。 –

+0

狀態機術語中的輸入動作是在進入狀態時執行的功能。與演員停止/開始生命週期無關。 –

+0

我明白了。你爲什麼不使用'goto(NewState).using(newData)'語法來改變狀態數據? –

回答

-1

如果要爲某個州添加進入或退出操作,您需要在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 */ 
} 
+1

這個問題明確地涉及到這個選項,並解釋了爲什麼它是不夠的 - 不可能改變狀態數據。 –

+0

我想我誤解了你的問題,因爲我以爲你只是想對狀態本身或actor中的某些局部變量執行檢查或操作,而不是數據本身。即使是錯誤的,我也會留下答案,因爲它回答了題目中的問題。 –

0

本書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()); 
     } 
    } 
    }) 
0

如阿卡的FSM documentation指出,初步currentState -> currentState通知將被觸發[調用initialize後。

像這樣的東西應該工作:

onTransition { 
    case InitialState -> InitialState => 
    // Do stuff 
}