[英]AKKA FSM : Messages are not delivered to FSM actor references properly
[英]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.