Любой конечный компьютер разумной сложности требует выполнения некоторых действий при входе в состояние. Например, диаграммы состояний машины 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
не очень понятно мне, как иметь дело с StateData, если указан как в Гото с использованием и изменен в обработчике ввода
Если вы хотите добавить действия для входа или выхода для состояния, вам необходимо использовать некоторые 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 */
}
Вопрос, явно связанный с этой опцией, и объяснил, почему он не является адекватным - невозможно изменить данные состояния. –
Думаю, я неправильно понял ваш вопрос, потому что я думал, что вы просто хотите выполнить проверки или действия над самим государством или с каким-то местным var в актере, а не с самими данными. Я оставлю ответ, даже если ошибаюсь, так как он отвечает на вопрос i. –
Книга Akka in Action также использует entry actions from UML. Они реализуют действия входа с использованием переходов с подстановочными знаками и используют внешние события для изменения состояния (но не данных состояния).
Полный scala example on github. Соответствующая часть в Скале:
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 AKKA, в первоначальный currentState -> currentState
уведомление будет срабатывать [после вызова initialize
].
Что-то, как это должно работать:
onTransition {
case InitialState -> InitialState =>
// Do stuff
}
К записи/действия выхода вы имеете в виду действия, выполняемые перед тем актер начал или после того, как актер остановился? Или вы имеете в виду побочные эффекты на переходах государства? Я думаю, что ваш вопрос не достаточно чист. –
Вступительные действия в терминологии государственного аппарата - это функции, выполняемые при входе в состояние. Не относится к жизненному циклу остановки/запуска Actor. –
Я понял. Почему бы вам не использовать синтаксис 'goto (NewState) .using (newData)' для изменения данных состояния? –