@Component
public class OrderStateListenerImpl extends StateMachineListenerAdapter<OrderStatus, ChangeEvent> {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void stateChanged(State<OrderStatus, ChangeEvent> from, State<OrderStatus, ChangeEvent> to) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("stateChanged");
stringBuilder.append(" from " + (null != from ? from.getId().name() : null));
stringBuilder.append(" to " + (null != to ? to.getId().name() : null));
logger.info(stringBuilder.toString());
}
@Override
public void transition(Transition<OrderStatus, ChangeEvent> transition) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("transition");
stringBuilder.append(" kind " + (null != transition.getKind() ? transition.getKind().name() : null));
stringBuilder.append(" from " + (null != transition.getSource() ? transition.getSource().getId().name() : null));
stringBuilder.append(" to " + (null != transition.getTarget() ? transition.getTarget().getId().name() : null));
stringBuilder.append(" trigger " + (null != transition.getTrigger() ? transition.getTrigger().getEvent().name() : null));
logger.info(stringBuilder.toString());
}
}
启动服务
@SpringBootApplication
public class FsmApplication implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(getClass());
public static void main(String[] args) {
SpringApplication.run(FsmApplication.class, args);
}
@Resource
private StateMachine<OrderStatus, ChangeEvent> stateMachine;
@Override
public void run(String... args) throws Exception {
stateMachine.start();
// 测试状态机消息变更
messageTransfer();
stateMachine.stop();
}
private void messageTransfer() {
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOid(123456789L);
orderInfo.setDesc("test order");
Message<ChangeEvent> message = null;
logger.info("current state {}", stateMachine.getState().getId().name());
// spring message 的payload设置为消息事件、header为额外需要带的参数
message = MessageBuilder.withPayload(ChangeEvent.PAYED).setHeader("order", orderInfo).build();
stateMachine.sendEvent(message);
logger.info("current state {}", stateMachine.getState().getId().name());
message = MessageBuilder.withPayload(ChangeEvent.DELIVERY).setHeader("order", orderInfo).build();
stateMachine.sendEvent(message);
logger.info("current state {}", stateMachine.getState().getId().name());
message = MessageBuilder.withPayload(ChangeEvent.RECEIVED).setHeader("order", orderInfo).build();
stateMachine.sendEvent(message);
logger.info("current state {}", stateMachine.getState().getId().name());
}
}
状态转移过程输出
transition kind INITIAL from null to WAIT_PAYMENT trigger null
stateChanged from null to WAIT_PAYMENT
current state WAIT_PAYMENT
PayedGuard payLoad "PAYED" messageHeader{"desc":"test order","oid":123456789}
PayedAction execute
transition kind EXTERNAL from WAIT_PAYMENT to WAIT_DELIVER trigger PAYED
stateChanged from WAIT_PAYMENT to WAIT_DELIVER
current state WAIT_DELIVER
DeliveryGuard payLoad "DELIVERY" messageHeader{"desc":"test order","oid":123456789}
DeliveryAction execute
transition kind EXTERNAL from WAIT_DELIVER to WAIT_RECEIVE trigger DELIVERY
stateChanged from WAIT_DELIVER to WAIT_RECEIVE
current state WAIT_RECEIVE
PayedGuard payLoad "RECEIVED" messageHeader{"desc":"test order","oid":123456789}
ReceivedAction execute
transition kind EXTERNAL from WAIT_RECEIVE to FINISH trigger RECEIVED
CommentGuard payLoad "RECEIVED" messageHeader{"desc":"test order","oid":123456789} flag 1
CommentGuard payLoad "RECEIVED" messageHeader{"desc":"test order","oid":123456789} flag 2
UncommentedAction execute
stateChanged from WAIT_RECEIVE to UNCOMMENTED
current state UNCOMMENTED