Это больше похоже на 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 -> Выбор;Выбор -> Б;Выбор -> 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
( официальный документ , содержащий примеры кода