2017-08-15 4 views
0

J'ai une question à propos de réinitialiser la machine d'état. configurationréinitialisation de la machine d'état de ressort

protected StateMachine<ProfilingState, ProfilingEvent> buildStateMachine(
      StateMachineBuilder.Builder<SomeState, SomeEvent> builder) throws Exception { 

    builder.configureStates() 
       .withStates() 
       .initial(SomeState.State1) 
       .states(EnumSet.allOf(SomeState.class)); 

     builder.configureTransitions() 
       .withExternal() 
       .source(SomeState.Step1) 
       .target(SomeState.Step2) 
       .event(SomeEvent.Event1) 
       .action(step1Action()) 
       .and() 
       .withExternal() 
       .source(SomeState.Step2) 
       .target(SomeState.Step3) 
       .event(SomeEvent.Event2) 
       .action(step2Action()) 
       .and(); 
      return builder.build(); 
     } 

J'ai api pour persister/restaurer machine d'état. Pendant la restauration, je réinitialise la machine d'état à l'état persistant précédent. Je suppose que je peux réinitialiser la machine d'état après un crash jvm et continuer à partir de mon dernier état persistant. Par exemple le dernier état persistant est Etape2. Supposons que l'action pour Step2 est une longue boucle. Supposons que le crash de Jvm ait eu lieu alors que certains étaient en train de traiter cette boucle. Au démarrage de l'application, l'application reconnaît qu'il existe des flux non terminés. Donc le but est de continuer à partir du dernier état persistant. Cela signifie que, après avoir réinitialisé la machine d'état à State2, j'attends que le step2Action soit déclenché et je continuerai le traitement, parce que Step2 n'était pas fini. Malheureusement, après avoir réinitialisé la machine d'état à State2, le step2Action n'a pas été appelé. Est-il possible de déclencher cette action pour ce cas?

Répondre

0

Non ce n'est pas comme step2Action l'action est attachée à une transition et la réinitialisation ne provoque aucune entrée pour un état. N'hésitez pas à créer une requête d'amélioration sur github car, en pensant à ce qui pourrait se produire après une réinitialisation, une action d'état pourrait être exécutée. Nous n'exécuterions jamais une action d'entrée car l'état n'est pas entré lors d'une réinitialisation mais comme je l'ai dit, il peut être logique d'exécuter une action d'état.