簡體   English   中英

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

[英]Some of the Actor messages are missing --AKKA FSM

這是示例代碼流:

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))=>”情況下,如果我注釋了代碼框(在以上代碼中合並),則未收到某些傳入的RowMap。 ),那么我可以看到收到了所有傳入的行圖。 誰能讓我知道為什么會這樣嗎? 我一直在尋找原因,但無法找到原因。
感謝您的幫助,謝謝。

if ( <somecondition> )為true,則您將進入TriggerRule狀態。 在那種狀態下,您正在尋找類型為EVENT消息,而不是Event (全部大寫)。 因此,該消息不由FSM處理。

通常,當FSM中缺少消息時,調試的最佳方法是編寫帶有日志/打印語句的whenUnhandled塊,以查看所定義的狀態未處理哪些消息。

代碼本身中的消息處理存在一些問題,我們對其進行了調試並解決了該問題,現在它可以無縫運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM