如何在 AKKA 的有限状态机中正确传递数据
How to correctly pass data in the Finite State machine in AKKA
我正在关注 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();
}
如何在状态机的各个状态之间正确传递数据?
对于发送消息给这个 FSM actor 的 actor,actor.tell 调用应该是什么样子的
如果我发送以下消息
MyFSM.tell(new someMessage(myData), getSelf());
它正确地匹配了事件并且参与者将状态更改为 EVALUATING
并发送回 EVALUATING
消息。但我真正想要的是,根据此状态更改和转换修改 'myData',将此修改后的数据发送给另一个演员。
但是当我发送 someMessage
类型的消息时,我无法发送现有的 myData 实例,并且它始终未初始化,作为状态机初始化的一部分。
换句话说,我正在尝试使用有限状态机来管理 myData 的状态。
我怎样才能做到他充分利用框架?
上述信息中的一个工作示例将非常有用!
您可以使用 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);
}));
我正在关注 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();
}
如何在状态机的各个状态之间正确传递数据?
对于发送消息给这个 FSM actor 的 actor,actor.tell 调用应该是什么样子的
如果我发送以下消息
MyFSM.tell(new someMessage(myData), getSelf());
它正确地匹配了事件并且参与者将状态更改为 EVALUATING
并发送回 EVALUATING
消息。但我真正想要的是,根据此状态更改和转换修改 'myData',将此修改后的数据发送给另一个演员。
但是当我发送 someMessage
类型的消息时,我无法发送现有的 myData 实例,并且它始终未初始化,作为状态机初始化的一部分。
换句话说,我正在尝试使用有限状态机来管理 myData 的状态。
我怎样才能做到他充分利用框架?
上述信息中的一个工作示例将非常有用!
您可以使用 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);
}));