如何在AKKA的有限状态机中正确传递数据

6

我正在遵循这个例子,来自文档

这是我正在使用的有限状态机的一部分

    startWith(ACCEPTED, new myData());


    when(ACCEPTED, matchEvent(someMesage.class, MyData.class,
        (someMessage, myData) -> goTo(EVALUATING).replying(EVALUATING)));

    onTransition(matchState(ACCEPTED,EVALUATING, () -> {
      // Here I want to update the nextState data and pass it to another actor 
      // But the nextState data is always the unititalized object which is new Mydata() when the FSM initializes


    }));
    whenUnhandled(matchAnyEvent(
        (state, data) -> stay().replying("received unhandled request " + state.toString())));

    initialize();
  }

我应该如何在状态机中正确传递数据?

给此FSM actor发送消息时,actor.tell调用应该是什么样子的?

如果我发送以下消息

  MyFSM.tell(new someMessage(myData), getSelf());

它正确地匹配事件和操作员更改状态为“EVALUATING”,并发送回“EVALUATING”消息。但我真正想要的是,基于这种状态变化和转换修改'myData',并在转换中将此修改后的数据发送到另一个操作员。
但是当我发送类型为“someMessage”的消息时,我无法发送现有的myData实例,并且它始终未初始化作为状态机的初始化的一部分。
换句话说,我正在尝试使用有限状态机管理myData的状态。
如何在最大程度利用框架的情况下实现这一点?
以上信息的工作示例将非常有用!
1个回答

0
您可以使用using来提供新的状态,如下所示:
when(ACCEPTED, matchEvent(someMesage.class, MyData.class,
  (someMessage, oldData) -> {
   MyData newState = new MyData(); // or transform the old into a new one
   return goTo(EVALUATING).using(newState).replying(EVALUATING);
}));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接