Входные действия с Akka FSM

Любой конечный автомат разумной сложности требует выполнения некоторых входных действий при входе в состояние. Например, в диаграммах конечного автомата UML для этой цели предусмотрено специальное действие. К сожалению, я не вижу, как я могу моделировать такие действия входа (или действия выхода) в Akka FSM. Выполнение действий над переходами (используя подчеркивание исходящего состояния) не работает, поскольку действия входа предназначены для изменения данных состояния (например, подготовка структур данных, необходимых для работы в новом состоянии). Любые советы о том, как моделировать действия входа/выхода в Akka FSM?


person Jacob Eckel    schedule 10.09.2015    source источник
comment
Под действиями входа/выхода вы имеете в виду действия, выполненные до запуска актора или после его остановки? Или вы имеете в виду побочные эффекты при переходах между состояниями? Я думаю, что ваш вопрос недостаточно чист.   -  person Mustafa Simav    schedule 12.09.2015
comment
Входные действия в терминологии конечного автомата — это функции, выполняемые при входе в состояние. Не связано с жизненным циклом остановки/запуска Актера.   -  person Jacob Eckel    schedule 16.09.2015
comment
Я понял. Почему бы вам не использовать синтаксис goto(NewState).using(newData) для изменения данных состояния?   -  person Mustafa Simav    schedule 16.09.2015


Ответы (4)


Как отмечено в Akka документация FSM, первоначальное уведомление currentState -> currentState будет запущено [после вызова initialize].

Что-то вроде этого должно работать:

onTransition {
  case InitialState -> InitialState =>
    // Do stuff
}
person jake256    schedule 02.05.2017

У меня была та же проблема, и я немного поиграл, модифицировав исходную черту 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 с помощью, так и изменен в обработчике ввода

person user3927784    schedule 31.10.2015

В книге 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());
        }
    }
  })
person Synox    schedule 14.03.2017

Если вы хотите добавить действия входа или выхода для состояния, которое вам нужно использовать, напишите 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 */
}
person Josep Prat    schedule 29.03.2016
comment
Вопрос явно относился к этой опции и объяснял, почему она неадекватна - невозможно изменить данные состояния. - person Jacob Eckel; 29.03.2016
comment
Думаю, я неправильно понял ваш вопрос, потому что думал, что вы просто хотите выполнить проверки или действия с самим состоянием или с какой-либо локальной переменной в актере, а не с самими данными. Я оставлю ответ, даже если он неправильный, поскольку он отвечает на вопрос в заголовке. - person Josep Prat; 30.03.2016