Spring源码

Spring-Statemachine 状态机

2017-10-24  本文已影响2875人  程序员驿站
image.png

介绍

Spring状态机为程序开发员提供了传统状态机和Spring应用程序使用,有以下特性:
* 易于使用的状态机的用例
* 层次的状态机结构缓解复杂状态机的配置
* 状态机提供更复杂的配置状态
* 使用触发器、转移、警卫以及动作
* 类型安全的配置适配器
* 状态机的事件监听器
* IOC将状态机和bean整合

名词解释

使用场景

例子

定义枚举和实现

/**
* 状态
*/
public enum Status{

    START,
    CANCEL,
    ENE;

}
/**
* 事件
*/
public enum Events {
    SAVE;
}

状态机配置

@Configuration
@EnableStateMachine(name = "orderStateMachine")
public class TestStateMachineConfig extends EnumStateMachineConfigurerAdapter<Status, Events> {

    @Resource
    private SaveAction saveAction;

    @Override
    public void configure(StateMachineStateConfigurer<Status, Events> states)
            throws Exception {
        states
                .withStates()
                .initial(Status.START)
                .states(EnumSet.allOf(Status.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<Status, Events> transitions)
            throws Exception {
        transitions
                .withExternal()
                .source(Status.START).target(Status.END)
                .event(Events.SAVE).action(saveAction)
                ;
    }

    @Override
    public void configure(StateMachineConfigurationConfigurer<Status, Events> config)
            throws Exception {
        config
                .withConfiguration().autoStartup(true)
                .listener(listener());
    }

    @Bean
    public StateMachineListener<Status, Events> listener() {
        return new StateMachineListenerAdapter<Status, Events>() {
            @Override
            public void transition(Transition<Status, Events> transition) {
                if (transition.getTarget().getId() == Status.START) {
                    System.out.println("订单创建,待支付");
                    return;
                }

            }
        };
    }


}

定义Action

@Component
public class SaveAction implements Action<Status, Events>{

    @Resource
    private OrderInfoService orderInfoService;

    @Override
    public void execute(StateContext<Status, Events> context) {
        Order order  = (Order) context.getMessageHeader(OrderStatusContextKey.ORDER_ENTITY_KEY);

        orderInfoService.save(order);

    }
}

状态机管理类

@Component
public class DefaultStateMachineManager implements InitializingBean, ApplicationContextAware {

    private static final String ORDER_STATE_MACHINE_CONFIG = "orderStateMachine";

    private ApplicationContext applicationContext;
    private StateMachine<Status, Events> orderStateMachine;
  

    @Override
    public void afterPropertiesSet() throws Exception {
        orderStateMachine = applicationContext.getBean(ORDER_STATE_MACHINE_CONFIG, StateMachine.class);
     
    }

    @Override
    public StateMachine<OrderStatus, Events> getOrderStateMachine() {
        return orderStateMachine;
    }

  

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

业务层

@Service
public class OrderBizImpl {

    @Resource
    private StateMachineManager stateMachineManager;

    @Override
    public void save(Order order) {

        if (order == null) {
            return;
        }

        StateMachine<Status, Events> orderStateMachine = stateMachineManager.getOrderStateMachine();

        Message<Events> message = MessageBuilder
                .withPayload(Events.SAVE)
                .setHeader(ORDER_ENTITY_KEY, order)
                .build();

        orderStateMachine.sendEvent(message);
    }


}
上一篇 下一篇

猜你喜欢

热点阅读