自定义状态机

附源码:https://gitee.com/Gjson/SpringCloud.git

Spring StateMachine框架可能对于大部分使用Spring的开发者来说还比较生僻,该框架的主要功能是帮助开发者简化状态机的开发过程,让状态机结构更加层次化

介绍Spring StateMachine状态机实现、自定义初始状态及监听器。

@Configuration
@EnableStateMachine
public  class MyStateMachineBuilder   extends EnumStateMachineConfigurerAdapter<States, Events> implements Builder , InitializingBean{
    Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    BeanFactory beanFactory;
    private States states;
    @Override
    public States getName() {
        logger.info("Builder getName");
        return states;
    }
    @Override
    public void  setName(States states){
        this.states=states;
    }

    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states)
            throws Exception {
        states
                .withStates()
                .initial(States.UNPAID)
                .states(EnumSet.allOf(States.class));
    }
    @Override
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
            throws Exception {
        transitions
                .withExternal()
                .source(States.UNPAID).target(States.WAITING_FOR_RECEIVE)
                .event(Events.PAY)
                .and()
                .withExternal()
                .source(States.UNPAID).target(States.WAITING_FOR_PENDING)
                .event(Events.DELAY_PAY)
                .and()
                .withExternal()
                .source(States.WAITING_FOR_RECEIVE).target(States.DONE)
                .event(Events.RECEIVE)
                .and()
                .withExternal()
                .source(States.UNPAID).target(States.CANCEL_BUYER)
                .event(Events.CANCEL)
                .and()
                .withExternal()
                .source(States.WAITING_FOR_PENDING).target(States.CANCEL_SELLER)
                .event(Events.CANCEL);
    }
    @Override
    public void configure(StateMachineConfigurationConfigurer<States, Events> config)
            throws Exception {
        config
                .withConfiguration()
                .listener(listener());
    }

    @Override
    public  StateMachine<States, Events> build(States states) throws Exception{
        logger.info("Builder build.");
        StateMachineBuilder.Builder<States, Events> builder = StateMachineBuilder.builder();

        builder.configureConfiguration()
                .withConfiguration().machineId("myState").autoStartup(true).beanFactory(beanFactory);

        builder.configureStates().withStates().initial(states).states(EnumSet.allOf(States.class));

        builder.configureTransitions()
                .withExternal()
                .source(States.UNPAID).target(States.WAITING_FOR_RECEIVE)
                .event(Events.PAY)
                .and()
                .withExternal()
                .source(States.UNPAID).target(States.WAITING_FOR_PENDING)
                .event(Events.DELAY_PAY)
                .and()
                .withExternal()
                .source(States.WAITING_FOR_RECEIVE).target(States.DONE)
                .event(Events.RECEIVE)
                .and()
                .withExternal()
                .source(States.UNPAID).target(States.CANCEL_BUYER)
                .event(Events.CANCEL)
                .and()
                .withExternal()
                .source(States.WAITING_FOR_PENDING).target(States.CANCEL_SELLER)
                .event(Events.CANCEL)
                .and()
                .withExternal()
                .source(States.WAITING_FOR_PENDING).target(States.WAITING_FOR_RECEIVE)
                .event(Events.PENDING)
                .and()
                .withExternal()
                .source(States.WAITING_FOR_RECEIVE).target(States.DONE)
                .event(Events.MONEY);
        StateMachine stateMachine = builder.build();
        stateMachine.addStateListener(listener());
        return stateMachine;
    }
    
    public StateMachineListener<States, Events> listener() {
        return new StateMachineListenerAdapter<States, Events>() {
            @Override
            public void transition(Transition<States, Events> transition) {
                if (transition.getTarget().getId() == States.UNPAID) {
                    logger.info("订单创建,待支付");
                    return;
                }
                if (transition.getSource().getId() == States.UNPAID
                        && transition.getTarget().getId() == States.WAITING_FOR_RECEIVE) {
                    logger.info("用户完成支付,待收货");
                    return;
                }
                if (transition.getSource().getId() == States.WAITING_FOR_RECEIVE
                        && transition.getTarget().getId() == States.DONE) {
                    logger.info("用户已收货,订单完成");
                    return;
                }
                if(transition.getSource().getId() == States.UNPAID
                        && transition.getTarget().getId() == States.CANCEL_BUYER){
                    logger.info("买家取消");
                    return;
                }
                if(transition.getSource().getId() == States.WAITING_FOR_PENDING
                        && transition.getTarget().getId() == States.CANCEL_SELLER){
                    logger.info("卖家取消");
                    return;
                }

                if(transition.getSource().getId() == States.UNPAID
                        && transition.getTarget().getId() == States.WAITING_FOR_PENDING){
                    logger.info("货到付款");
                    return;
                }
            }
        };
    }

    @Override
    public void afterPropertiesSet() throws Exception {

    }
}
 public void run(String... args) throws Exception {


        stateMachine=myStateMachineBuilder.build(States.UNPAID);
        stateMachine.sendEvent(Events.CANCEL);

        stateMachine=myStateMachineBuilder.build(States.WAITING_FOR_RECEIVE);
        stateMachine.sendEvent(Events.RECEIVE);


    }

2017-06-19 16:00:46.635  INFO 10200 --- [           main] Builder$$EnhancerBySpringCGLIB$$908ecf40 : Builder build.
2017-06-19 16:00:46.652  INFO 10200 --- [           main] o.s.s.support.LifecycleObjectSupport     : started org.springframework.statemachine.support.DefaultStateMachineExecutor@750ed637
2017-06-19 16:00:46.652  INFO 10200 --- [           main] o.s.s.support.LifecycleObjectSupport     : started DONE INITED UNPAID CANCEL_SELLER WAITING_FOR_PENDING CANCEL_BUYER WAITING_FOR_RECEIVE  / UNPAID / uuid=4c2212ee-be6f-43e7-8622-227ba622cf44 / id=myState
2017-06-19 16:00:47.890  INFO 10200 --- [           main] Builder$$EnhancerBySpringCGLIB$$908ecf40 : 买家取消
2017-06-19 16:00:47.892  INFO 10200 --- [           main] Builder$$EnhancerBySpringCGLIB$$908ecf40 : Builder build.
2017-06-19 16:00:47.893  INFO 10200 --- [           main] o.s.s.support.LifecycleObjectSupport     : started org.springframework.statemachine.support.DefaultStateMachineExecutor@469a7575
2017-06-19 16:00:47.893  INFO 10200 --- [           main] o.s.s.support.LifecycleObjectSupport     : started DONE INITED UNPAID CANCEL_SELLER WAITING_FOR_PENDING CANCEL_BUYER WAITING_FOR_RECEIVE  / WAITING_FOR_RECEIVE / uuid=4f473ede-a0fa-4ca7-b1a9-6e4abd61253f / id=myState
2017-06-19 16:00:48.423  INFO 10200 --- [           main] Builder$$EnhancerBySpringCGLIB$$908ecf40 : 用户已收货,订单完成
2017-06-19 16:00:48.425  INFO 10200 --- [           main] com.gson.Application                     : Started Application in 8.847 seconds (JVM running for 9.29)

猜你喜欢

转载自blog.csdn.net/simplemurrina/article/details/73479860