定義你的狀態
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瞭解更多信息。
*這樣簡單的目的* - 像什麼?你沒有描述如何處理狀態之間的轉換,允許哪些轉換等等。如果你只是將狀態存儲在'Order'中,那麼簡單枚舉就足夠了。 –
從Spring狀態機文檔中,我將不得不實現一個StateChange Listener,然後從DB獲取訂單,設置狀態並保存回DB。所有這些步驟將由Listener類而不是OrderService完成。我不知道我們是否有另一種實現方式 –