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
beans分别附加到状态的入口和出口。
@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发送到状态机。
Using StateContext
StateContext在处理状态机时是最重要的对象之一,因为它被传递到各种方法和回调中,以给出状态机的当前状态以及它可能发生的情况。如果简化一点,它可以被认为是 StateContext传递的当前状态机阶段的快照。
** _ 在Spring Statemachine 1.0.x
StateContext中,使用它的方式比较简单,就如何将它用作简单的东西而言POJO。_ **
** 从开始Spring Statemachine 1.1.x
它的作用已经使其成为一个状态机中的头等公民有了很大的提高 。 **
在整体StateContext中可以用作。
- 访问最新的Message,Event或他们 MessageHeaders如果知道。
- 访问状态机Extended State。
- 访问StateMachine自己。
- 访问可能的状态机错误。
- Transition如果适用, 访问最新版本。
- 访问状态机可能从中进入和去往的源和目标状态。
- Stage 访问电流。
StateContext被传入与用户likeAction和进行交互的各种组件Guard。
_ Stage 是stage状态机当前正在与用户交互的一个表示。目前的阶段是EVENT_NOT_ACCEPTED,EXTENDED_STATE_CHANGED, STATE_CHANGED,STATE_ENTRY,STATE_EXIT,STATEMACHINE_ERROR, STATEMACHINE_START,STATEMACHINE_STOP,TRANSITION, TRANSITION_START和TRANSITION_END它看起来像那些比赛如何用户可以与听众中描述互动非常熟悉 ,有一些用例只是想知道状态机发生了什么,对某些事情做出反应或仅仅为了调试目的而进行日志记录。SSM提供了用于添加侦听器的接口,然后在出现各种状态更改,动作等时提供选项以获得回调。
你基本上有两个选择,要么聆听Spring应用程序上下文事件,要么直接将侦听器附加到状态机。这些基本上都会提供相同的信息,其中一个通过监听器接口将事件生成为事件类和其他生成回调。这两者都有优点和缺点,将在稍后讨论。_