Spring StateMachine - настройка из базы данных - PullRequest
0 голосов
/ 22 февраля 2019

Во всех примерах, которые я просматривал в Интернете, StateMachine настроен статически

 @Override
public void configure(StateMachineTransitionConfigurer<BookStates, BookEvents> transitions) throws Exception {
    transitions
            .withExternal()
            .source(BookStates.AVAILABLE)
            .target(BookStates.BORROWED)
            .event(BookEvents.BORROW)
            .and()
            .withExternal()
            .source(BookStates.BORROWED)
            .target(BookStates.AVAILABLE)
            .event(BookEvents.RETURN)
            .and()
            .withExternal()
            .source(BookStates.AVAILABLE)
            .target(BookStates.IN_REPAIR)
            .event(BookEvents.START_REPAIR)
            .and()
            .withExternal()
            .source(BookStates.IN_REPAIR)
            .target(BookStates.AVAILABLE)
            .event(BookEvents.END_REPAIR);
 }

Я хотел бы настроить StateMachine «динамически», выбирая источник, цель, событие из базы данных и проходя черезСписок, чтобы настроить это «текучим» образом.

Возможно ли это?

1 Ответ

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

Да, это возможно через пользовательскую реализацию StateMachineModelFactory.Вы можете подключить его, используя StateMachineModelConfigurer примерно так:

@Configuration
@EnableStateMachine
public static class Config1 extends StateMachineConfigurerAdapter<String, String> {

    @Override
    public void configure(StateMachineModelConfigurer<String, String> model) throws Exception {
        model
            .withModel()
                .factory(modelFactory());
    }

    @Bean
    public StateMachineModelFactory<String, String> modelFactory() {
        return new CustomStateMachineModelFactory();
    }
}

В своей реализации вы можете динамически загружать все, что нужно для модели SM, из внешних служб.Ниже приведен пример из официального документа :

public static class CustomStateMachineModelFactory implements StateMachineModelFactory<String, String> {

    @Override
    public StateMachineModel<String, String> build() {
        ConfigurationData<String, String> configurationData = new ConfigurationData<>();
        Collection<StateData<String, String>> stateData = new ArrayList<>();
        stateData.add(new StateData<String, String>("S1", true));
        stateData.add(new StateData<String, String>("S2"));
        StatesData<String, String> statesData = new StatesData<>(stateData);
        Collection<TransitionData<String, String>> transitionData = new ArrayList<>();
        transitionData.add(new TransitionData<String, String>("S1", "S2", "E1"));
        TransitionsData<String, String> transitionsData = new TransitionsData<>(transitionData);
        StateMachineModel<String, String> stateMachineModel = new DefaultStateMachineModel<String, String>(configurationData,
                statesData, transitionsData);
        return stateMachineModel;
    }

    @Override
    public StateMachineModel<String, String> build(String machineId) {
        return build();
    }
}

Вы можете легко загружать состояния и переходы из БД динамически и заполнять ConfigurationData.

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