Вступительные действия с 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 */
}
Другие вопросы по тегам