一些Actor消息丢失了--AKKA FSM

时间:2014-09-04 05:32:18

标签: 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.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。和 如果我评论代码块(在上面的代码中加粗),那么我可以看到所有传入的行图都被收到了。 谁能让我知道为什么会这样?我一直试图找到原因,但无法得到它。
感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

if ( <somecondition> )为真时,您将转移到TriggerRule状态。在该州,您正在查找EVENT类型而非Event(全部上限)的消息。因此FSM不会处理该消息。

通常,在FSM中丢失消息时,最好的调试方法是使用log / print语句编写whenUnhandled块,以查看已定义的状态未处理的消息。

答案 1 :(得分:-1)

代码本身的消息处理存在一些问题,我们对其进行了调试并修复了问题,现在它无缝地工作。