Spring-Statemachine:对伪状态的访问,已跳过

时间:2019-02-15 16:09:00

标签: java spring spring-statemachine

首先,我的主要目标是说明状态机图。

方法StateMachineFactory<S, E>#getStateMachine()构建我的stateMachine的新实例。 StateMachine<S, E>有很多方法,例如getStates(): Collection<State<S, E>>getTransitions(): Collection<Transition<S,E>>

为了创建一个简单的状态机图,我需要所有与状态相关的状态。上面的方法getStates()给了我所有状态,但是方法getTransitions()并没有给我所有的态。

例如,为了理解,我的意思是。给出了以下状态机图和相应的状态机machineenter image description here

以下方法为我提供了结果:

  • machine.getInitialState()-> State_A
  • machine.getStates()-> State_AState_BState_CState_DState_EChoice
  • machine.getTransitions
    • State_A-> Choice
    • Stabe_B-> State_D
    • State_C-> State_E

如何从Choice-> State_BChoice-> State_C中获得剩余的晶体管?

Javdoc将过渡描述为状态机与状态关联的事物。这到底是什么意思?

最后但并非最不重要的一点是,我如何在不模拟整个触发事件的情况下,遍历状态机的状态和跨状态并记录防护,转换和所有其他内容?

1 个答案:

答案 0 :(得分:2)

这更像是3个问题,而不是一个,但是我们开始:

  

我如何从Choice-> State_B和   选择-> State_C吗?

如果要完全访问StateMachineConfig,则必须查看StateMachineModel。 一种方法是定义自己的StateMachineModelVerifier,调用super(),然后从模型中读取所需内容:

@Override
public void configure(StateMachineConfigurationConfigurer<States, Events> config)
        throws Exception {
    config
        .withVerifier()
            .enabled(true)
            .verifier(cusomVerifier());
}

@Bean    
public StateMachineModelVerifier customVerifier() {
  return new CustomVerifier();
}

class CustomVerifier extends DefaultStateMachineModelVerifier {
  @Override
  public void verify(StateMachineModel model) {
    super.verify(model); // call the existing sanity check model verifier
    TransitionsData<S,E> transitions = model.getTransitionsData();
  }
}

通过TransitionsData,您可以获得所有选择等。

  

Javdoc将过渡描述为状态机   与状态变化相关联。这到底是什么意思?

输入选择或结点实际上不会触发状态转换。 这些是伪状态,在伪状态下评估条件,SM以此为基础来决定下一步转移的位置。

例如在您的情况下,国家A->选择->国家B或国家C

可能的过渡是:

  • A-> B
  • A-> C

没有A->选择;选择-> B;选择-> C

  

最后但并非最不重要的一点,我该如何经历自己的状态和跨境   状态机并记录防护,过渡和所有其他内容   而不模拟整个触发事件?

我不太了解您的问题,但请考虑:

  • 记录防护措施-自己在防护方法中实现登录;
  • 使用您自己的监听器记录SM转换(请参见下面的示例);

注册监听器

@Override
public void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception {
  config.withConfiguration().listener(stateChangeListener());
}

private StateMachineListenerAdapter stateChangeListener() {
   return new StateMachineListenerAdapter<States, Events> () {

        //Override what's necessary, but particularly
        @Override
        public void stateChanged(State<S,E> from, State<S,E> to) {
            //logging
        }
   }
}

单步执行状态机

考虑使用StateMachineTestPlanofficial doc,其中包含代码示例)