【问题标题】:akka fsm matchEvent implemantationakka fsm matchEvent 实现
【发布时间】:2017-03-13 13:08:40
【问题描述】:

我正在尝试理解 AKKA fsm“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 - 谓词匹配的事件类型 - 将根据数据和事件评估的谓词 apply - 如果匹配,则应用于事件和状态数据的操作 返回:添加了 case 语句的构建器

谁能告诉我事件的匹配是如何实现的?

【问题讨论】:

标签: java events akka fsm


【解决方案1】:

摘自文档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();
  }
}

【讨论】:

    【解决方案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<>()))));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 2019-02-10
      • 2016-07-14
      • 1970-01-01
      • 2021-12-17
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多