2016-10-31 5 views
0

私はアッカFSM "matchEvent" を理解しようとしています:アッカ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) 

はcase文を追加していますイベントタイプと述語が と一致する場合に一致します。パラメータ:eventType - 述語で照合するイベント型 - データとイベントで評価される述語apply - 一致する場合にイベントと状態データに適用するアクション 戻り値:ケースを持つビルダー声明が追加されました

イベントの一致がどのように実装されているか教えてください。ドキュメントsimple exampleから抽出

+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を使用できるかどうかによって異なります。 ところで、akkaは2.4になりました。2.3 APIをチェックする理由は何ですか? –

+0

私はJAVA 8を使用しています。私は最新のAPIを使用しています。リンクが2.3でない理由はありません。 – user2164744

+0

http://doc.akka.io/docs/akka/2.4/java/で素晴らしい例があります。 lambda-fsm.html#A_Simple_Example ここでは、Java 8でAkka FSMを実装する方法の良い例があります –

答えて

0

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