在企业开发中,数据在不同的业务间传输是最常见的工作,所以虽然我们的主架构是用的状态机,也就是从流程状态的角度来看待这个项目,但在具体业务中,每个状态的转变中会牵涉到各类业务,这些业务有些需要收到状态机变化的通知,需要把状态值传递给业务类和业务方法,同样的,在处理状态变化是,也需要获取业务数据,方便不同的业务在同一个状态变化环节做各自的业务,下面我们就讲下这个数据在spring statemachine里面的传递。
发送Event时传入订单信息
Message。它其实不是spirng statemachine专属的,它是spring里面通用的一种消息工具,看它的源代码:
public interface Message<T> {
T getPayload();
MessageHeaders getHeaders();
}
在spring statemachine里面,我们把状态塞到message的payload里面,然后把需要传递的业务数据(例子里面就是order对象)塞到header里面。创建message用的是messagebuilder,看它的名字就知道是专门创建message的。
@Slf4j
@RestController
public class TestController {
@Autowired
private RefundReasonMachineBuilder refundReasonMachineBuilder;
@Autowired
private BeanFactory beanFactory;
@GetMapping("test/machine")
public void testMachine(@RequestParam String orderSn) throws Exception {
StateMachine<RefundReasonStatus, RefundReasonEvents> stateMachine = refundReasonMachineBuilder.build(beanFactory);
stateMachine.start();
//发送订单信息
Order order = new Order();
order.setOrderSn(orderSn);
order.setMobile("13613650996");
order.setSkuId(98765L);
Message<RefundReasonEvents> message = MessageBuilder.withPayload(RefundReasonEvents.APPROVE)
.setHeader("order", order).build();
stateMachine.sendEvent(message);
log.info("最终状态:" + stateMachine.getState().getId());
}
}
创建了message后,状态机sendEvent就可以不只是传一个event,可以组合event(OrderEvents.RECEIVE)和数据内容(order)一起发送给状态机变化的处理类:
@OnTransition(target = "APPROVED")
public void approve(Message<RefundReasonEvents> message) {
log.info("传递的参数:" + message.getHeaders().get("order"));
log.info("审批通过");
}
到这里为止,状态机通过message对象就和其他的业务代码做到了数据连接。其实这个很关键,只有做到和其他业务的数据传递,才能算的上真正的可用。