2015-09-10 20 views
2

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

+0

К записи/действия выхода вы имеете в виду действия, выполняемые перед тем актер начал или после того, как актер остановился? Или вы имеете в виду побочные эффекты на переходах государства? Я думаю, что ваш вопрос не достаточно чист. –

+0

Вступительные действия в терминологии государственного аппарата - это функции, выполняемые при входе в состояние. Не относится к жизненному циклу остановки/запуска Actor. –

+0

Я понял. Почему бы вам не использовать синтаксис 'goto (NewState) .using (newData)' для изменения данных состояния? –

ответ

0

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

-1

Если вы хотите добавить действия для входа или выхода для состояния, вам необходимо использовать некоторые 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 */ 
} 
+1

Вопрос, явно связанный с этой опцией, и объяснил, почему он не является адекватным - невозможно изменить данные состояния. –

+0

Думаю, я неправильно понял ваш вопрос, потому что я думал, что вы просто хотите выполнить проверки или действия над самим государством или с каким-то местным var в актере, а не с самими данными. Я оставлю ответ, даже если ошибаюсь, так как он отвечает на вопрос i. –

0

Книга 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()); 
     } 
    } 
    }) 
0

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

Что-то, как это должно работать:

onTransition { 
    case InitialState -> InitialState => 
    // Do stuff 
}