如何将Spring状态机用于Order对象

时间:2016-03-10 09:05:44

标签: java spring spring-mvc spring-statemachine

我正在尝试在我的项目中使用Spring State Machine,因为有一个对象是Order,有几个状态

  • NEW
  • PAID
  • 包装的
  • DELIVERED
  • 取消
  • RETURNED

该对象可以实现如下

public class Order {
  private String id;
  private Customer customer;
  private OrderState state;
// Some other fields with getter and setter
}

我介绍了OrderService,从DB获取订单,设置包括OrderState在内的一些信息,然后保存到DB。

但是我不知道如何将Spring状态机应用到这个中,是否过于复杂而无法使用这样的简单目的?

1 个答案:

答案 0 :(得分:6)

定义你的状态

public enum OrederStates {
   NEW, PAID, PACKAGED; // etc
}

然后定义您的活动

public enum OrderEvents {
    PAYMENT, PACK, DELIVER; // etc 
}

然后声明你的事件监听器

@WithStateMachine
public class OrderEventHandler {
    @Autowired
    OrderService orderService;

    @OnTransition(src= "NEW",target = "PAID")
    handlePayment() {
       // Your code orderService.*
       // ..   
    }
    // Other handlers
}

现在将您的应用程序配置为使用状态机

@Configuration
@EnableStateMachine
static class Config1 extends EnumStateMachineConfigurerAdapter<States, Events> {

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

    @Override
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
            throws Exception {
        transitions
            .withExternal()
                .source(OrderStates.NEW).target(OrderStates.PAID)
                .event(OrderEvents.PAYMENT)
                .and()
            .withExternal()
                .source(OrderStates.PAID).target(OrderStates.PACKED)
                .event(OrderEvents.PACK);
    }
}

最后在您的应用程序/控制器中使用它

public class MyApp {

    @Autowired
    StateMachine<States, Events> stateMachine;

    void doSignals() {
        stateMachine.start();
        stateMachine.sendEvent(OrderEvents.PAYMENT);
        stateMachine.sendEvent(Events.PACK);
    }
 }

使用此guide开始使用状态机,并使用此referce了解详情。