Define your states
public enum OrederStates {
NEW, PAID, PACKAGED; // etc
}
Then define your events
public enum OrderEvents {
PAYMENT, PACK, DELIVER; // etc
}
Then declare your event listeners
@WithStateMachine
public class OrderEventHandler {
@Autowired
OrderService orderService;
@OnTransition(src= "NEW",target = "PAID")
handlePayment() {
// Your code orderService.*
// ..
}
// Other handlers
}
Now configure your application to to use state machine
@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);
}
}
And finally use it in your Application/Controller
public class MyApp {
@Autowired
StateMachine<States, Events> stateMachine;
void doSignals() {
stateMachine.start();
stateMachine.sendEvent(OrderEvents.PAYMENT);
stateMachine.sendEvent(Events.PACK);
}
}
Use this guide for getting started with state machine and this referce to learn more.
Order
, simple enum is quite enough. – Widner