【问题标题】:How to correctly pass data in the Finite State machine in AKKA如何在 AKKA 的有限状态机中正确传递数据
【发布时间】:2018-10-20 23:20:13
【问题描述】:

我在 doc 上关注这个例子

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

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

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

actor.tell 调用对于向该 FSM 演员发送消息的演员来说应该是怎样的

如果我发送以下消息

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

它与事件正确匹配,并且参与者将状态更改为EVALUATING 并发送回EVALUATING 消息。但我真正想要的是,根据此状态更改和转换修改“myData”,将修改后的数据发送给另一个参与者。

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

换句话说,我正在尝试使用有限状态机来管理 myData 的状态。

我怎样才能实现他对框架的最佳利用?

上述信息中的一个工作示例将非常有用!

【问题讨论】:

    标签: java akka fsm


    【解决方案1】:

    您可以使用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);
    }));
    

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 2021-03-08
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多