天天看点

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对象就和其他的业务代码做到了数据连接。其实这个很关键,只有做到和其他业务的数据传递,才能算的上真正的可用。