Spring-Statemachine: доступ к псевдосостояниям, которые пропускаются - PullRequest
0 голосов
/ 15 февраля 2019

Прежде всего, моя основная задача - проиллюстрировать диаграмму конечного автомата.

Метод StateMachineFactory<S, E>#getStateMachine() создает новый экземпляр моего stateMachine.У StateMachine<S, E> есть много методов, таких как getStates(): Collection<State<S, E>> и getTransitions(): Collection<Transition<S,E>>.

Чтобы создать простую диаграмму конечного автомата, мне нужны все состояния, связанные с их переходами.Вышеупомянутый метод getStates() дает мне все состояния, но метод getTransitions() не дает мне все переходы.

Например, чтобы понять, что я имею в виду.Приведена следующая схема конечного автомата и соответствующий конечный автомат machine: enter image description here

Следующие методы дают мне результат:

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

Как я могу получить оставшиеся переходы от Choice -> State_B и Choice -> State_C?

Javdoc описывает переход как нечто, что конечный автомат связывает с изменением состояния.Что это именно означает?

И последнее, но не менее важное: как я могу проходить через состояния и переходы моего конечного автомата и регистрировать охрану, переходы и все остальное, не высмеивая целые инициирующие события?

1 Ответ

0 голосов
/ 15 февраля 2019

Это больше похоже на 3 вопроса, а не на один, но здесь мы пойдем:

Как я могу получить оставшиеся переходы от выбора -> 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 -> Выбор;Выбор -> Б;Выбор -> C

И последнее, но не менее важное: как я могу проходить через состояния и переходы моего конечного автомата и регистрировать охрану, переходы и все остальное, не высмеивая целые события запуска?

Я не до конца понимаю ваш вопрос, но учтите:

  • logging guard - реализовывать регистрацию в самих методах guard;
  • logging 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
        }
   }
}

Пошаговый конечный автомат

Рассмотрите возможность использования StateMachineTestPlan ( официальный документ , содержащий примеры кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...