16. Using Actions

从用户角度来看,操作是最有用的组件之一,可以与状态机进行交互和协作。 动作可以在状态机的不同位置及其状态生命周期中执行,例如进入或退出状态或转换期间。

@Override
public void configure(StateMachineStateConfigurer<States, Events> states)
        throws Exception {
    states
        .withStates()
            .initial(States.SI)
            .state(States.S1, action1(), action2())
            .state(States.S2, action1(), action2())
            .state(States.S3, action1(), action3());
}

上面的action1和action2 bean分别附加到状态的入口和出口。

@Bean
public Action<States, Events> action1() {
    return new Action<States, Events>() {

        @Override
        public void execute(StateContext<States, Events> context) {
        }
    };
}

@Bean
public BaseAction action2() {
    return new BaseAction();
}

@Bean
public SpelAction action3() {
    ExpressionParser parser = new SpelExpressionParser();
    return new SpelAction(
            parser.parseExpression(
                    "stateMachine.sendEvent(T(org.springframework.statemachine.docs.Events).E1)"));
}

public class BaseAction implements Action<States, Events> {

    @Override
    public void execute(StateContext<States, Events> context) {
    }
}

public class SpelAction extends SpelExpressionAction<States, Events> {

    public SpelAction(Expression expression) {
        super(expression);
    }
}

您可以直接将Action实现为匿名函数,或者创建自己的实现并将相应的实现定义为bean。

在action3中,SpEL表达式用于将事件Events.E1发送到状态机。

StateContext在第19章使用StateContext中进行了介绍。

16.1 SpEL Expressions with Actions

也可以使用SpEL表达式替代完整的Action实现。

results matching ""

    No results matching ""