akka fsm matchEvent реализация

Я пытаюсь понять АККА ФСМ "matchEvent":

public final <ET> FSMStateFunctionBuilder<S, D> matchEvent(Class<ET> eventType, TypedPredicate2<ET, D> predicate, Apply2<ET, D, State<S, D>> apply) {
        return (new FSMStateFunctionBuilder()).event(eventType, predicate, apply);
    }

после просмотра в http://doc.akka.io/japi/akka/2.3.4/index.html?akka/actor/AbstractFSM.html вот что я нашел:

public <P> FSMStateFunctionBuilder<S,D> event(java.lang.Class<P> eventType,
                                              FI.TypedPredicate2<P,D> predicate,
                                              FI.Apply2<P,D,FSM.State<S,D>> apply)

Добавьте оператор case, который соответствует, если тип события и предикат совпадают. Параметры: eventType - тип события для сопоставления по предикату - предикат, который будет оцениваться по данным и применяемому событию - действие, применяемое к событию и данным состояния при наличии совпадения Возвраты: построитель с добавлением оператора case

Может кто-нибудь сказать мне, пожалуйста, как реализовано совпадение событий?

2 ответа

Если вы хотите выразить условие защиты на основе поля входящего события или данных (или комбинации), используйте что-то вроде...:

when(Active, Duration.create(1, "second"),
    matchEvent(Arrays.asList(Flush.class, StateTimeout()), Todo.class,
      (event, todo) -> todo.getQueue != null //any logical condition using event or data, 

      (event, todo) -> goTo(Idle).using(todo.copy(new LinkedList<>()))));

Извлеченный из документов простой пример:

...
public class Buncher extends AbstractFSM<State, Data> {
{
  startWith(Idle, Uninitialized);

  when(Idle,
    matchEvent(SetTarget.class, Uninitialized.class,
      (setTarget, uninitialized) ->
        stay().using(new Todo(setTarget.getRef(), new LinkedList<>()))));

  // transition elided ...

  when(Active, Duration.create(1, "second"),
    matchEvent(Arrays.asList(Flush.class, StateTimeout()), Todo.class,
      (event, todo) -> goTo(Idle).using(todo.copy(new LinkedList<>()))));

  // unhandled elided ...

  initialize();
  }
}
Другие вопросы по тегам