久久久久亚洲精品中文玫瑰,免费av搞逼搞逼搞嫩逼,亚洲国产精品v在线播放,丝袜秘书20p

您的位置:首頁 >寬帶 > 正文

今日熱聞!聊聊Cola-StateMachine輕量級狀態(tài)機(jī)的實(shí)現(xiàn)

來源:博客園 時(shí)間:2023-06-07 12:57:34
背景

在分析Seata的saga模式實(shí)現(xiàn)時(shí),實(shí)在是被其復(fù)雜的 json 狀態(tài)語言定義文件勸退,我是有點(diǎn)沒想明白為啥要用這么來實(shí)現(xiàn)狀態(tài)機(jī);盲猜可能是基于可視化的狀態(tài)機(jī)設(shè)計(jì)器來定制化流程,更方便快捷且上手快吧,畢竟可以通過UI直接操作,設(shè)計(jì)狀態(tài)流轉(zhuǎn)圖,但我暫時(shí)不太能get到。對于Saga模式的實(shí)現(xiàn),之前的博文中已經(jīng)闡述了基于狀態(tài)機(jī)模式實(shí)現(xiàn)Saga,是比較常見且合適的做法,因此了解了下Java中的狀態(tài)機(jī)實(shí)現(xiàn)方案,以后有相關(guān)的業(yè)務(wù)場景也可以直接上手使用狀態(tài)機(jī)。

Cola-StateMachine

Cola-StateMachine組件是一種輕量級的、無狀態(tài)的、基于注解的狀態(tài)機(jī)實(shí)現(xiàn),可以方便地管理訂單等業(yè)務(wù)對象的狀態(tài)轉(zhuǎn)換。COLA框架的狀態(tài)機(jī)使用了連貫接口(Fluent Interfaces)來定義狀態(tài)和事件,以及對應(yīng)的動作和檢查。COLA框架的狀態(tài)機(jī)是COLA 4.0應(yīng)用架構(gòu)的一部分,旨在控制復(fù)雜度,提高開發(fā)效率。開發(fā)背景可見實(shí)現(xiàn)一個(gè)狀態(tài)機(jī)引擎,教你看清DSL的本質(zhì)。


(相關(guān)資料圖)

基礎(chǔ)模型

在Cola-StateMachine組件中有如下的抽象概念模型:

1.State:狀態(tài)2.Event:事件,狀態(tài)由事件觸發(fā),引起變化3.Transition:流轉(zhuǎn),表示從一個(gè)狀態(tài)到另一個(gè)狀態(tài)4.External Transition:外部流轉(zhuǎn),兩個(gè)不同狀態(tài)之間的流轉(zhuǎn)5.Internal Transition:內(nèi)部流轉(zhuǎn),同一個(gè)狀態(tài)之間的流轉(zhuǎn)6.Condition:條件,表示是否允許到達(dá)某個(gè)狀態(tài)7.Action:動作,到達(dá)某個(gè)狀態(tài)之后,可以做什么8.StateMachine:狀態(tài)機(jī)

Cola-StateMachine鏈路圖業(yè)務(wù)應(yīng)用示例

基于訂單業(yè)務(wù)的場景,做一個(gè)簡單的demo。

關(guān)閉訂單的簡單流程圖

關(guān)閉訂單簡單的狀態(tài)流轉(zhuǎn)圖

添加依賴

    com.alibaba.cola    cola-component-statemachine    4.3.1

定義一個(gè)訂單的實(shí)體類、訂單狀態(tài)的枚舉值、訂單事件的枚舉值

@Data@Builderpublic class Order {    public OrderStatusEnum orderStatusEnum;    public Integer orderId;    public String orderName;}public enum OrderStatusEnum {    INIT("0", "待付款"),    WAITING_FOR_DELIVERY("1", "待發(fā)貨"),    HAVE_BEEN_DELIVERY("2", "已發(fā)貨"),    CLOSE("3", "已取消");    private final String code;    private final String info;    OrderStatusEnum(String code, String info)    {        this.code = code;        this.info = info;    }    public String getCode()    {        return code;    }    public String getInfo()    {        return info;    }}public enum OrderEvent {    /**     * 用戶關(guān)閉     */    USER_CLOSE("0", "用戶取消"),    /**     * 管理員關(guān)閉     */    ADMIN_CLOSE("1", "后臺取消"),    /**     * 超時(shí)關(guān)閉     */    OVERTIME_CLOSE("2", "超時(shí)取消"),    /**     * 檢查錯(cuò)誤關(guān)閉     */    CHECK_ERROR_CLOSE("3", "上級審核取消"),    /**     * 用戶付費(fèi)     */    USER_PAY("4", "用戶支付");    /**     * 密碼     */    private final String code;    /**     * 信息     */    private final String info;    /**     * 訂單事件     *     * @param code 密碼     * @param info 信息     */    OrderEvent(String code, String info) {        this.code = code;        this.info = info;    }    /**     * 獲取代碼     *     * @return {@link String}     */    public String getCode() {        return code;    }    /**     * 獲取信息     *     * @return {@link String}     */    public String getInfo() {        return info;    }}

在容器啟動的時(shí)候注冊一個(gè)訂單狀態(tài)變更的工廠

@Componentpublic class StateMachineBuilderConfig {    @Autowired    UserCloseAction userCloseAction;    @Bean("orderOperaMachine")    public StateMachine orderOperaMachine() {        String ORDER_OPERA = "order_opera";        StateMachineBuilder builder = StateMachineBuilderFactory.create();        //訂單從初始化狀態(tài)-待發(fā)貨-狀態(tài)-轉(zhuǎn)到-關(guān)閉訂單狀態(tài)--用戶關(guān)閉        builder.externalTransitions()                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.USER_CLOSE)                .when(checkCondition())                .perform(userCloseAction);        //訂單從-初始化狀態(tài)-已發(fā)貨-待發(fā)貨--轉(zhuǎn)到-關(guān)閉訂單狀態(tài)--后臺操作人員關(guān)閉        builder.externalTransitions()                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.HAVE_BEEN_DELIVERY, OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.ADMIN_CLOSE)                .when(checkCondition())                .perform(doAction());        //訂單從等待發(fā)貨狀態(tài)-轉(zhuǎn)為-訂單關(guān)閉狀態(tài)-超時(shí)關(guān)閉        builder.externalTransition()                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.OVERTIME_CLOSE)                .when(checkCondition())                .perform(doAction());        //訂單從待發(fā)貨狀態(tài)--轉(zhuǎn)為-訂單關(guān)閉狀態(tài)-上級審批不通過關(guān)閉        builder.externalTransition()                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.CHECK_ERROR_CLOSE)                .when(checkCondition())                .perform(doAction());        //訂單從初始化狀態(tài)--轉(zhuǎn)為待發(fā)貨狀態(tài)--用戶支付完畢動        builder.externalTransition()                .from(OrderStatusEnum.INIT)                .to(OrderStatusEnum.WAITING_FOR_DELIVERY)                .on(OrderEvent.USER_PAY)                .when(checkCondition())                .perform(doAction());        StateMachine orderOperaMachine = builder.build(ORDER_OPERA);        //打印uml圖        String plantUML = orderOperaMachine.generatePlantUML();        System.out.println(plantUML);        return orderOperaMachine;    }    private Condition checkCondition() {        return (ctx) -> {            return true;        };    }    private Action doAction() {        return (from, to, event, ctx) -> {            System.out.println(ctx.getOrderName() + " 正在操作 " + ctx.getOrderId() + " from:" + from + " to:" + to + " on:" + event);        };    }}

在定義一個(gè)特殊的,只是舉個(gè)例子,可以通過集成的方式集成實(shí)現(xiàn)一個(gè)用戶關(guān)單的具體操作

@Componentpublic class UserCloseAction implements Action {    @Override    public void execute(OrderStatusEnum from, OrderStatusEnum to, OrderEvent event, Order context) {        System.out.println("用戶關(guān)閉流程開始走了");        System.out.println("從這個(gè)狀態(tài)-【" + from.getInfo() + "】-轉(zhuǎn)為+【" + to.getInfo() + "】 的狀態(tài)");        System.out.println("上下文信息:" + context.toString());        System.out.println("中間執(zhí)行的一些操作.......");        System.out.println("用戶關(guān)閉流程完畢了");    }}

定義一個(gè) controller 的操作接口

@RestControllerpublic class OrderOperaController {    @Autowired    @Qualifier("orderOperaMachine")    StateMachine orderOperaMachine;    /**     * 場景1-用戶關(guān)閉訂單     *     * @return {@link Boolean}     */    @RequestMapping("userclose")    public Boolean userCloseOrder() {        //把訂單狀態(tài)改為關(guān)閉        String machineId = orderOperaMachine.getMachineId();        System.out.println(machineId);        Order order = Order.builder().orderId(1).orderName("用戶").orderStatusEnum(OrderStatusEnum.INIT).build();        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.INIT,OrderEvent.USER_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }    /**     * 場景2-管理員關(guān)閉訂單     *     * @return {@link Boolean}     */    @RequestMapping("adminClose")    public Boolean adminCloseOrder() {        //把訂單狀態(tài)改為關(guān)閉        Order order = Order.builder().orderId(1).orderName("后臺操作人員").orderStatusEnum(OrderStatusEnum.HAVE_BEEN_DELIVERY).build();        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.HAVE_BEEN_DELIVERY, OrderEvent.ADMIN_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }    /**     * 場景3-超時(shí)關(guān)閉訂單     *     * @return {@link Boolean}     */    @RequestMapping("overTimeclose")    public Boolean overTimeCloseOrder() {        //把訂單狀態(tài)改為關(guān)閉        Order order = Order.builder().orderId(1).orderName("超時(shí)了關(guān)閉訂單")                .orderStatusEnum(OrderStatusEnum.WAITING_FOR_DELIVERY).build();        //OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.CLOSE, OrderEvent.OVERTIME_CLOSE, order);        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.WAITING_FOR_DELIVERY, OrderEvent.OVERTIME_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }    /**     * 場景4-檢查錯(cuò)誤關(guān)閉訂單     *     * @return {@link Boolean}     */    @RequestMapping("checkErrorClose")    public Boolean checkErrorCloseOrder() {        //把訂單狀態(tài)改為關(guān)閉        Order order = Order.builder().orderId(1).orderName("上級檢查錯(cuò)誤").orderStatusEnum(OrderStatusEnum.WAITING_FOR_DELIVERY).build();        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.WAITING_FOR_DELIVERY, OrderEvent.CHECK_ERROR_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }}

啟動程序

安裝UML

隨便新建一個(gè)uml文件,然后將啟動程序的控制臺輸出內(nèi)容復(fù)制到uml中

最后運(yùn)行下

標(biāo)簽:

相關(guān)閱讀

兴山县| 东莞市| 崇左市| 鄂尔多斯市| 武清区| 西青区| 麦盖提县| 麻栗坡县| 重庆市| 崇州市| 青岛市| 广宗县| 潼南县| 清流县| 阿克陶县| 灵川县| 沈阳市| 咸宁市| 临猗县| 博罗县| 徐水县| 通道| 壶关县| 阿拉善左旗| 上思县| 常德市| 平顶山市| 焦作市| 中宁县| 革吉县| 平乐县| 辽中县| 博野县| 清丰县| 库伦旗| 新乡县| 湾仔区| 望奎县| 长寿区| 清水县| 山西省|