【问题标题】:Spring-Statemachine: Access to PseudoStates, that are skippedSpring-Statemachine:访问被跳过的伪状态
【发布时间】:2019-02-15 16:09:00
【问题描述】:

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

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

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

例如为了理解我的意思。给出下面的状态机图和对应的状态机machine

以下方法给了我结果:

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

如何从Choice 获取剩余的转换 --> State_BChoice --> State_C

Javdoc 将转换描述为状态机与状态变化相关联的东西。这到底是什么意思?

最后但并非最不重要的一点是,如何在不模拟整个触发事件的情况下通过状态机的状态和转换并记录守卫、转换和所有其他内容?

【问题讨论】:

    标签: java spring spring-statemachine


    【解决方案1】:

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

    如何从 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你可以获得所有的Choices等等

    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,其中包含代码示例)

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2016-12-07
      • 2022-01-24
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多