Любой конечный автомат разумной сложности требует выполнения некоторых входных действий при входе в состояние. Например, в диаграммах конечного автомата UML для этой цели предусмотрено специальное действие. К сожалению, я не вижу, как я могу моделировать такие действия входа (или действия выхода) в Akka FSM. Выполнение действий над переходами (используя подчеркивание исходящего состояния) не работает, поскольку действия входа предназначены для изменения данных состояния (например, подготовка структур данных, необходимых для работы в новом состоянии). Любые советы о том, как моделировать действия входа/выхода в Akka FSM?
Входные действия с Akka FSM
Ответы (4)
Как отмечено в Akka документация FSM, первоначальное уведомление currentState -> currentState
будет запущено [после вызова initialize
].
Что-то вроде этого должно работать:
onTransition {
case InitialState -> InitialState =>
// Do stuff
}
У меня была та же проблема, и я немного поиграл, модифицировав исходную черту 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
Мне не очень понятно, как быть с StateData, когда он указан как в goto с помощью, так и изменен в обработчике ввода
В книге Akka в действии также используется входные действия из UML. Они реализуют действия входа с использованием переходов с подстановочными знаками и используют внешние события для изменения состояния (но не данных состояния).
Существует полный пример scala на 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());
}
}
})
Если вы хотите добавить действия входа или выхода для состояния, которое вам нужно использовать, напишите PartialFunction в onTransition.
Например, вот как вы моделируете действия входа или выхода в 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 */
}
goto(NewState).using(newData)
для изменения данных состояния? - person Mustafa Simav   schedule 16.09.2015