2014-09-04 3 views
0

Здесь поток образец кода:Некоторые из Actor сообщений отсутствуют --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) и на основании некоторые вычисления, он перемещается для запуска правила.

К сожалению, для некоторых странных причин некоторые входящие RowMaps не принимаются в случае «case Event (RowMap (m), t @ EvaluteRuleMap (v, c)) =>» и Если я прокомментирую код bock (выделенные жирным шрифтом в приведенном выше коде), тогда я мог видеть все входящие строки. Может ли кто-нибудь сообщить мне, почему так? Я пытался найти причину, но не смог ее получить.
Цените свою помощь, спасибо.

ответ

0

Когда if (<somecondition>) правдиво, вы переезжаете в состояние TriggerRule. В этом состоянии вы ищете сообщения типа EVENT вместо Event (все колпачки). Таким образом, сообщение не обрабатывается FSM.

В общем случае, когда отсутствует сообщение в FSM, лучшим способом отладки является запись блока whenUnhandled с помощью оператора log/print, чтобы узнать, какие сообщения не обрабатываются указанными вами состояниями.

+0

К сожалению, это опечатка, ее просто событие не СОБЫТИЕ. исправил его. – Avis

+0

Можете ли вы поместить блок whenUnhandled и посмотреть, есть ли там какие-нибудь сообщения? –

+0

Да, у меня на самом деле было это, когда был обработан {} блок, но я до сих пор не вижу никаких сообщений, идущих туда. У меня также есть блок OnTransition {}, где я мог видеть переход состояния, но что-то странное поведение при переключении между состояниями. Есть предположения? – Avis

0

Была проблема с обработкой сообщений в самом коде, мы отлаживали его и исправляли проблему, теперь она работает без проблем.

Смежные вопросы