以下是示例代码流程:
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(_, _) => ....
}
}
}
当控件处于“EVALRule”状态时,它将继续接收流映射(RowMap)并基于某些计算,移动到触发规则。
不幸的是,由于一些奇怪的原因,在“case Event(RowMap(m),t @ EvaluteRuleMap(v,c))=&gt;”中没有收到一些传入的RowMaps。和
如果我评论代码块(在上面的代码中加粗),那么我可以看到所有传入的行图都被收到了。
谁能让我知道为什么会这样?我一直试图找到原因,但无法得到它。
感谢您的帮助,谢谢。
答案 0 :(得分:0)
当if ( <somecondition> )
为真时,您将转移到TriggerRule
状态。在该州,您正在查找EVENT
类型而非Event
(全部上限)的消息。因此FSM不会处理该消息。
通常,在FSM中丢失消息时,最好的调试方法是使用log / print语句编写whenUnhandled
块,以查看已定义的状态未处理的消息。
答案 1 :(得分:-1)
代码本身的消息处理存在一些问题,我们对其进行了调试并修复了问题,现在它无缝地工作。