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

use*_*mda 5 java fsm akka

我在这里从文档中遵循这个例子

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

    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();
  }
Run Code Online (Sandbox Code Playgroud)

如何在状态机中的各种状态之间正确传递数据?

如果actor向此FSM actor发送消息,actor.tell调用应该如何

如果我发送以下消息

  MyFSM.tell(new someMessage(myData), getSelf());
Run Code Online (Sandbox Code Playgroud)

它正确匹配事件,并且actor将状态更改为EVALUATING并发回EVALUATING消息.坚持我真正想要的是,根据状态变化和转换修改'myData',将此修改后的数据发送给另一个actor.

但是当我发送类型为someMessageI 的消息时,无法发送myData的现有实例,并且它始终未初始化为状态机初始化的一部分.

换句话说,我试图用有限状态机来管理myData的状态.

如何实现他对框架的最佳利用?

以上信息的实例将非常有用!

joh*_*ren 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);
}));
Run Code Online (Sandbox Code Playgroud)