我正在尝试在我的项目中使用Spring State Machine,因为有一个对象是Order
,有几个状态
该对象可以实现如下
public class Order {
private String id;
private Customer customer;
private OrderState state;
// Some other fields with getter and setter
}
我介绍了OrderService,从DB获取订单,设置包括OrderState在内的一些信息,然后保存到DB。
但是我不知道如何将Spring状态机应用到这个中,是否过于复杂而无法使用这样的简单目的?
答案 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);
}
}