Как добавить параметры Dynami c к действию автомата пружины? - PullRequest
3 голосов
/ 20 февраля 2020

У меня есть простая конфигурация конечного автомата:

@Configuration 
@EnableStateMachine 
public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapter<State, Boolean> {

    @Override
    public void configure(StateMachineStateConfigurer<State, Boolean> states) throws Exception {
        states.withStates()
                .initial(State.INITIAL)
                .states(EnumSet.allOf(State.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<State, Boolean> transitions) throws Exception {
        transitions
            .withExternal() 
                .source(State.INITIAL)
                .target(State.HAS_CUSTOMER_NUMBER)
                .event(true)
                .action(retrieveCustomerAction()) 
                // here I'd like to retrieve the customer from this action, like:
                // stateMachine.start();
                // stateMachine.sendEvent(true);
                // stateMachine.retrieveCustomerFromAction();
            .and()
            .withExternal()
                .source(State.INITIAL)
                .target(State.NO_CUSTOMER_NUMBER)
                .event(false)
                .action(createCustomerAction()); 
                // here I'd like to send the customer instance to create, like:
                // stateMachine.start();
                // stateMachine.sendEvent(false);
                // stateMachine.sendCustomerToAction(Customer customer);
    }

    @Bean
    public Action<State, Boolean> retrieveCustomerAction() {
        return ctx -> System.out.println(ctx.getTarget().getId());
    }

    @Bean
    public Action<State, Boolean> createCustomerAction() {
        return ctx -> System.out.println(ctx.getTarget().getId());
    }

}

Можно ли улучшить определение действий, чтобы иметь возможность взаимодействовать с ними с параметрами динамики? Как я могу добавить поведение потребителей или поставщиков к этим действиям?

1 Ответ

0 голосов
/ 25 февраля 2020

Можно ли улучшить определение действий, чтобы иметь возможность взаимодействовать с ними с помощью параметров динамики?

Да, это возможно. Вы можете сохранить переменные в хранилище контекста и затем извлекать их в любом месте.

public class Test {

  @Autowired
  StateMachine<State, Boolean> stateMachine;

  public void testMethod() {

    stateMachine.getExtendedState().getVariables().put(key, value);
    stateMachine.start();
    stateMachine.sendEvent(true);
  }
}

И вы можете получить это значение из контекста, используя ключ. Предположим, что значение имеет тип String, тогда его можно получить следующим образом: -

    @Bean
    public Action<State, Boolean> retrieveCustomerAction() {
        return ctx -> {
        String value = ctx.getExtendedState().get(key, String.class);
        // Do Something
        };
    }

Более подробно вы можете ссылаться на link и this

Как я могу добавить поведение потребителей или поставщиков к этим действиям?

Не могли бы вы подробнее остановиться на этом вопросе

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