Scala 一些演员信息缺失——AKKA FSM
以下是示例代码流:Scala 一些演员信息缺失——AKKA FSM,scala,akka,fsm,state-machine,Scala,Akka,Fsm,State Machine,以下是示例代码流: class FSMActor{ when(Idle) { case Event(Start, Uninitialized) => case Event(InitMap(inMap), t @ EvaluteRuleMap(v, c)) => logger.info(s"State = $stateName, Event = Event(_, InitMap(inMap))") goto(EVALRule) using t
class FSMActor{
when(Idle) {
case Event(Start, Uninitialized) =>
case Event(InitMap(inMap), t @ EvaluteRuleMap(v, c)) =>
logger.info(s"State = $stateName, Event = Event(_, InitMap(inMap))")
goto(EVALRule) using t.copy(ruleMap = inMap)
}
when(EVALRule) {
case Event(RowMap(m), t @ EvaluteRuleMap(v, c)) =>
logger.debug("input row map m " + m)
**if ( <somecondition> ) { // If comment this if-else block, I could see rowMaps being received.
logger.debug(s"Moving to State Trigger x=$x")
goto(TriggerRule) using t.copy(ruleMap = x.get)
} else {
logger.debug(s"staying in EVALRule, x = $x")
stay
}**
}
when(TriggerRule) {
case Event(_, _) => ....
}
}
}
class-FSMActor{
何时(空闲){
案例事件(开始,未初始化)=>
案例事件(InitMap(inMap),t@EvaluteRuleMap(v,c))=>
info(s“State=$stateName,Event=Event(u,InitMap(inMap))”)
使用t.copy(ruleMap=inMap)转到(EVALRule)
}
何时(评估规则){
案例事件(行映射(m),t@EvaluteRuleMap(v,c))=>
logger.debug(“输入行映射m”+m)
**if(){//if注释这个if-else块,我可以看到接收到的行映射。
logger.debug(s“移动到状态触发器x=$x”)
使用t.copy(ruleMap=x.get)转到(TriggerRule)
}否则{
logger.debug(s“留在EVALRule中,x=$x”)
停留
}**
}
何时(触发规则){
案例事件(,)=>。。。。
}
}
}
当控件处于“EVALRule”状态时,它将继续接收流映射(RowMap),并基于一些计算,移动到触发规则
不幸的是,由于某些奇怪的原因,一些传入的行映射在“case事件(行映射(m),t@EvaluteRuleMap(v,c))=>和
如果我对代码bock(在上面的代码中用粗体表示)进行注释,那么我可以看到接收到的所有传入行映射。
有人能告诉我为什么会这样吗?我一直在努力寻找原因,但无法找到原因。感谢您的帮助,谢谢。当
如果()
为真,您将进入触发规则
状态。在该状态下,您正在查找类型为EVENT
的消息,而不是EVENT
(全部大写)。因此,FSM不处理该消息
一般来说,当FSM中缺少消息时,最好的调试方法是使用log/print语句编写一个
whenhandled
块,以查看哪些消息不是由您定义的状态处理的。代码本身的消息处理有一些问题,我们对其进行了调试并修复了该问题,现在它可以无缝工作 对不起,这是打字错误,只是事件而不是事件。更正了。你能放一个whenUnhandled块,看看是否有消息到达那里吗?是的,我实际上有那个whenUnhandled{}块,但我仍然没有看到任何消息到达那里。我还有一个OnTransition{}块,在那里我可以看到状态转换发生,但在状态之间切换时会出现一些奇怪的行为。有什么想法吗?