在企業開發中,資料在不同的業務間傳輸是最常見的工作,是以雖然我們的主架構是用的狀态機,也就是從流程狀态的角度來看待這個項目,但在具體業務中,每個狀态的轉變中會牽涉到各類業務,這些業務有些需要收到狀态機變化的通知,需要把狀态值傳遞給業務類和業務方法,同樣的,在處理狀态變化是,也需要擷取業務資料,友善不同的業務在同一個狀态變化環節做各自的業務,下面我們就講下這個資料在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對象就和其他的業務代碼做到了資料連接配接。其實這個很關鍵,隻有做到和其他業務的資料傳遞,才能算的上真正的可用。