我试图理解AKKA "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语句的生成器。
有谁能告诉我,事件的匹配是如何实现的?
发布于 2016-11-03 16:16:25
从docs 简单例子中提取
...
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();
}
}发布于 2017-10-15 00:48:49
如果您想表示基于传入事件字段或数据(或组合)的保护条件,请使用以下内容:
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<>()))));https://stackoverflow.com/questions/40342375
复制相似问题