2016-10-31 8 views
0

Я пытаюсь понять AKKA FSM "matchEvent":Akka FSM matchEvent implemantation

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) 

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

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

+0

Я рекомендую ознакомиться с http://doc.akka.io/docs/akka/2.4/java/lambda-fsm.html или http://doc.akka.io/docs/akka/2.4 /java/fsm.html в зависимости от того, можете ли вы использовать Java8 или нет. BTW, akka теперь в 2.4, по любой причине, почему вы проверяете API 2.3? –

+0

Я использую JAVA 8 .. Я использую последнюю api, нет причин, почему ссылка 2.3 – user2164744

+0

Тогда у вас есть хороший пример на http://doc.akka.io/docs/akka/2.4/java/ lambda-fsm.html # A_Simple_Example Здесь у вас есть хороший пример того, как реализовать Akka FSM в Java8 –

ответ

0

Выдержки из документации simple example:

... 
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(); 
    } 
} 
0

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

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<>()))));