Guide

spring-statemachine

Concept

  • State Machine
    状态机,将状态结合、转移、事件整合到一起的机器
  • State
    一个不变的状态模型
    主要由一个事件修改实体的状态
  • Extended State
    扩展状态是一组特殊的变量保存在一个状态机中,可以保存业务数据。
  • Transition
    源状态和目标状态之间的关系,它可能是复合过度的一部分,它规定在一个特定的事件发生时某个状态转移的情况。
  • Event
    事件,驱动状态转移的实体。
  • Initial State
    初始状态
  • End State
    终态
  • History State
    记录状态机最后的活动状态,存在两种模式
  • Choice State
    状态转移选择,相当于if/else
  • Fork State
    状态分支
  • Join State
    状态合并
  • Region
    区域,一个父状态与数个子状态组成的状态区
  • guard
    状态保护机制,对一个状态转移进行评估,评估值为true允许状态转移,评估值为false禁止转移
  • Action
    状态转移动作,在转移进行的时候触发的动作

适用情况

下列情况适合使用状态机:

  • 应用或者其一部分可以用状态表示。
  • 希望将复杂的逻辑拆分,获得更清晰更简单的逻辑。
  • 应用遇到并发问题,即异步导致的问题。

初步尝试适用状态机:

  • 使用布尔标志和枚举建立状态模型
  • 仅使用在应用生命周期内具有意义的状态。
  • 使用有限的状态,每种状态或状态的组合都有意义和相应的处理方法。

Example

StateMachineConfigurer

  1. StateMachineModel

  2. StateMachineConfiguration

  3. StateMachineState

  4. StateMachineTransition

StateMachine && StateMachineFactory

区别

StateMachine Persit Or Set State

StateMachine Repository

状态机持久化

StateMachineTransitionConfigurer

在初始化配置状态机时,我们必须配置此配置,此配置从表面来看就是状态机进行转换过滤时的配置。

配置时的方向是:

  1. External
  2. Internal
  3. Local
  4. Choice
  5. Junction
  6. Fork
  7. Join
  8. Entry
  9. Exit
  10. History
/**
 * Configurer interface exposing different type of transitions.
 *
 * @author Janne Valkealahti
 *
 * @param <S> the type of state
 * @param <E> the type of event
 */
public interface StateMachineTransitionConfigurer<S, E> {

   /**
    * Gets a configurer for external transition.
    *
    * @return {@link ExternalTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    * @see #withLocal()
    */
   ExternalTransitionConfigurer<S, E> withExternal() throws Exception;

   /**
    * Gets a configurer for internal transition. Internal transition is used
    * when action needs to be executed without causing a state transition. With
    * internal transition source and target state is always a same and it is
    * identical with self-transition in the absence of state entry and exit
    * actions.
    *
    * @return {@link InternalTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   InternalTransitionConfigurer<S, E> withInternal() throws Exception;

   /**
    * Gets a configurer for local transition. Local transition doesn’t cause
    * exit and entry to source state if target state is a substate of a source
    * state. Other way around, local transition doesn’t cause exit and entry to
    * target state if target is a superstate of a source state.
    *
    * @return {@link LocalTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   LocalTransitionConfigurer<S, E> withLocal() throws Exception;

   /**
    * Gets a configurer for transition from a choice pseudostate.
    *
    * @return {@link ChoiceTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   ChoiceTransitionConfigurer<S, E> withChoice() throws Exception;

   /**
    * Gets a configurer for transition from a junction pseudostate.
    *
    * @return {@link JunctionTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   JunctionTransitionConfigurer<S, E> withJunction() throws Exception;

   /**
    * Gets a configurer for transition from a fork pseudostate.
    *
    * @return {@link ForkTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   ForkTransitionConfigurer<S, E> withFork() throws Exception;

   /**
    * Gets a configurer for transition from a join pseudostate.
    *
    * @return {@link JoinTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   JoinTransitionConfigurer<S, E> withJoin() throws Exception;

   /**
    * Gets a configurer for transition from an entrypoint pseudostate.
    *
    * @return {@link EntryTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   EntryTransitionConfigurer<S, E> withEntry() throws Exception;

   /**
    * Gets a configurer for transition from an exitpoint pseudostate.
    *
    * @return {@link ExitTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   ExitTransitionConfigurer<S, E> withExit() throws Exception;

   /**
    * Gets a configurer for default history transition.
    *
    * @return {@link HistoryTransitionConfigurer} for chaining
    * @throws Exception if configuration error happens
    */
   HistoryTransitionConfigurer<S, E> withHistory() throws Exception;
}

Using StateMachineRuntimePersister

关于订单的github项目 https://github.com/otrosien/spring-statemachine-jpa-and-rest.git

例子: https://github.com/cjqCN/spring-statemachine-learning.git

二级审批流:https://github.com/kmyhy/statemachine

Spring StateMachine Persit

StateMachine Create By State

   public synchronized boolean handleEventWithState(Message<E> event, S state) {
        stateMachine.stop();
        List<StateMachineAccess<S, E>> withAllRegions = stateMachine.getStateMachineAccessor()
                .withAllRegions();
        for (StateMachineAccess<S, E> a : withAllRegions) {
            a.resetStateMachine(new DefaultStateMachineContext<>(state, null, null, null));
        }

        stateMachine.start();
        return stateMachine.sendEvent(event);
    }

StateMachine 可以存储那些信息