Вступительные действия с Akka FSM
Любой конечный автомат разумной сложности требует выполнения некоторых действий при входе в состояние. Например, для диаграмм конечного автомата UML есть специальное действие для этой цели. К сожалению, я не вижу, как я могу смоделировать такие входные действия (или выходные действия) в Akka FSM. Выполнение действий над переходами (с использованием подчеркивания исходящего состояния) не работает, поскольку действия ввода предназначены для изменения данных состояния (например, подготовка структур данных, необходимых для работы в новом состоянии). Любой совет, как смоделировать действия входа / выхода в Akka FSM?
4 ответа
Как отмечено в документации 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 using и изменен в обработчике ввода
В книге " Акка в действии" также используются входные действия из UML. Они реализуют действия входа, используя переходы с подстановочными знаками, и используют внешние события для изменения состояния (но не данных состояния).
На github есть полный пример scala. Соответствующая часть в 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 */
}