天天看點

Spring StateMachine學習(三) —— 傳遞參數

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