国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊Cola-StateMachine輕量級狀態機的實現

開發
對于Saga模式的實現,之前的博文中已經闡述了基于狀態機模式實現Saga,是比較常見且合適的做法,因此了解了下Java中的狀態機實現方案,以后有相關的業務場景也可以直接上手使用狀態機。

背景

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

Cola-StateMachine

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

基礎模型

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

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

Cola-StateMachine鏈路圖

業務應用示例

基于訂單業務的場景,做一個簡單的demo。

關閉訂單的簡單流程圖

關閉訂單簡單的狀態流轉圖

添加依賴

<dependency>
    <groupId>com.alibaba.cola</groupId>
    <artifactId>cola-component-statemachine</artifactId>
    <version>4.3.1</version>
</dependency>

定義一個訂單的實體類、訂單狀態的枚舉值、訂單事件的枚舉值

@Data
@Builder
public class Order {

    public OrderStatusEnum orderStatusEnum;
    public Integer orderId;
    public String orderName;

}

public enum OrderStatusEnum {
    INIT("0", "待付款"),
    WAITING_FOR_DELIVERY("1", "待發貨"),
    HAVE_BEEN_DELIVERY("2", "已發貨"),
    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 {
    /**
     * 用戶關閉
     */
    USER_CLOSE("0", "用戶取消"),
    /**
     * 管理員關閉
     */
    ADMIN_CLOSE("1", "后臺取消"),
    /**
     * 超時關閉
     */
    OVERTIME_CLOSE("2", "超時取消"),
    /**
     * 檢查錯誤關閉
     */
    CHECK_ERROR_CLOSE("3", "上級審核取消"),

    /**
     * 用戶付費
     */
    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;
    }
}

在容器啟動的時候注冊一個訂單狀態變更的工廠

@Component
public class StateMachineBuilderConfig {
    @Autowired
    UserCloseAction userCloseAction;

    @Bean("orderOperaMachine")
    public StateMachine orderOperaMachine() {
        String ORDER_OPERA = "order_opera";
        StateMachineBuilder<OrderStatusEnum, OrderEvent, Order> builder = StateMachineBuilderFactory.create();
        //訂單從初始化狀態-待發貨-狀態-轉到-關閉訂單狀態--用戶關閉
        builder.externalTransitions()
                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.WAITING_FOR_DELIVERY)
                .to(OrderStatusEnum.CLOSE)
                .on(OrderEvent.USER_CLOSE)
                .when(checkCondition())
                .perform(userCloseAction);
        //訂單從-初始化狀態-已發貨-待發貨--轉到-關閉訂單狀態--后臺操作人員關閉
        builder.externalTransitions()
                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.HAVE_BEEN_DELIVERY, OrderStatusEnum.WAITING_FOR_DELIVERY)
                .to(OrderStatusEnum.CLOSE)
                .on(OrderEvent.ADMIN_CLOSE)
                .when(checkCondition())
                .perform(doAction());
        //訂單從等待發貨狀態-轉為-訂單關閉狀態-超時關閉
        builder.externalTransition()
                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)
                .to(OrderStatusEnum.CLOSE)
                .on(OrderEvent.OVERTIME_CLOSE)
                .when(checkCondition())
                .perform(doAction());
        //訂單從待發貨狀態--轉為-訂單關閉狀態-上級審批不通過關閉
        builder.externalTransition()
                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)
                .to(OrderStatusEnum.CLOSE)
                .on(OrderEvent.CHECK_ERROR_CLOSE)
                .when(checkCondition())
                .perform(doAction());
        //訂單從初始化狀態--轉為待發貨狀態--用戶支付完畢動
        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<Order> checkCondition() {
        return (ctx) -> {
            return true;
        };
    }

    private Action<OrderStatusEnum, OrderEvent, Order> doAction() {
        return (from, to, event, ctx) -> {
            System.out.println(ctx.getOrderName() + " 正在操作 " + ctx.getOrderId() + " from:" + from + " to:" + to + " on:" + event);
        };
    }

}

在定義一個特殊的,只是舉個例子,可以通過集成的方式集成實現一個用戶關單的具體操作

@Component
public class UserCloseAction implements Action<OrderStatusEnum, OrderEvent, Order> {

    @Override
    public void execute(OrderStatusEnum from, OrderStatusEnum to, OrderEvent event, Order context) {
        System.out.println("用戶關閉流程開始走了");
        System.out.println("從這個狀態-【" + from.getInfo() + "】-轉為+【" + to.getInfo() + "】 的狀態");
        System.out.println("上下文信息:" + context.toString());
        System.out.println("中間執行的一些操作.......");
        System.out.println("用戶關閉流程完畢了");
    }
}

定義一個 controller 的操作接口

@RestController
public class OrderOperaController {

    @Autowired
    @Qualifier("orderOperaMachine")
    StateMachine<OrderStatusEnum, OrderEvent, Order> orderOperaMachine;

    /**
     * 場景1-用戶關閉訂單
     *
     * @return {@link Boolean}
     */
    @RequestMapping("userclose")
    public Boolean userCloseOrder() {
        //把訂單狀態改為關閉
        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-管理員關閉訂單
     *
     * @return {@link Boolean}
     */
    @RequestMapping("adminClose")
    public Boolean adminCloseOrder() {
        //把訂單狀態改為關閉
        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-超時關閉訂單
     *
     * @return {@link Boolean}
     */
    @RequestMapping("overTimeclose")
    public Boolean overTimeCloseOrder() {
        //把訂單狀態改為關閉
        Order order = Order.builder().orderId(1).orderName("超時了關閉訂單")
                .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-檢查錯誤關閉訂單
     *
     * @return {@link Boolean}
     */
    @RequestMapping("checkErrorClose")
    public Boolean checkErrorCloseOrder() {
        //把訂單狀態改為關閉
        Order order = Order.builder().orderId(1).orderName("上級檢查錯誤").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

隨便新建一個uml文件,然后將啟動程序的控制臺輸出內容復制到uml中

最后運行下

責任編輯:張燕妮 來源: 互聯網架構小馬哥
相關推薦

2025-04-28 08:25:00

狀態機框架狀態機開發

2022-03-06 19:57:50

狀態機easyfsm項目

2024-10-10 17:46:06

2011-06-24 16:09:24

Qt 動畫 狀態機

2024-08-26 14:32:43

2023-03-06 07:35:30

狀態機工具訂單狀態

2025-10-29 07:38:45

2020-12-02 13:33:58

函數指針編程語言

2023-12-13 08:22:45

SQLite關系型數據庫

2021-07-08 09:15:20

單片機編程狀態機編程語言

2010-06-18 12:38:38

UML狀態機視圖

2020-03-27 10:50:29

DSL 狀態機工具

2013-09-03 09:57:43

JavaScript有限狀態機

2010-06-18 13:25:44

UML狀態機視圖

2011-06-29 18:36:59

Qt 動畫 狀態機

2020-10-15 10:38:35

C語言狀態模型

2025-12-09 03:00:00

2021-04-29 09:31:05

前端開發技術

2010-07-08 13:03:31

UML狀態機圖

2020-05-21 11:02:00

數據庫工具 CMDB
點贊
收藏

51CTO技術棧公眾號

国产精品久久午夜| 国产精品一品二品| 亚洲精品在线免费播放| 亚洲国产精品无码av| 一区二区三区在线观看免费| 中文字幕成人在线| 国产在线视频网| 久久综合色8888| 欧美精品国产精品久久久 | 亚洲女人天堂视频| 免费在线看污| 久久久久久久国产精品影院| 日本不卡一区| 欧美第十八页| 97视频在线观看免费高清完整版在线观看| 成人在线免费观看黄色| 色诱视频网站一区| 国产网站av| 国产丝袜在线精品| 99国产精品白浆在线观看免费| 亚洲精品1区| 国产在线拍揄自揄视频不卡99| 国产另类在线| 日韩中文字幕在线播放| 69av成人| 欧美成人一区二区三区片免费| 日韩欧美亚洲系列| 亚洲欧洲性图库| 国产视频在线视频| 99re66热这里只有精品3直播| 亚洲三级一区| 石原莉奈一区二区三区在线观看| 91观看网站| 91亚洲国产| 国产精品热视频| 免费电影一区二区三区| 性色av一区二区三区免费| 性欧美video另类hd尤物| 精品爽片免费看久久| 黄色影院在线看| 亚洲成人中文字幕| 123区在线| 亚洲老头同性xxxxx| 裤袜国产欧美精品一区| 亚洲最大在线视频| 欧美亚洲综合视频| 裸体女人亚洲精品一区| 国产精品视频一区视频二区| 久久亚洲国产精品成人av秋霞| 亚洲国产伊人| 91精品国产91久久久| 国内精品久久久久久久影视简单| 国产精品高潮呻吟久久av野狼 | 日韩aⅴ视频一区二区三区| 亚洲久久一区二区| 久久精品丝袜高跟鞋| 三级在线观看一区二区| 四虎永久在线精品免费一区二区| 蜜臀av性久久久久蜜臀av麻豆| 日韩精品国内| 精品性高朝久久久久久久| 亚洲天堂免费电影| 91精品国产综合久久香蕉的特点 | 欧美成人ⅴideosxxxxx| 亚洲成av人影院在线观看| 波多野结衣中文字幕久久| 日韩精品电影网| 四虎精品永久免费| 亚洲91精品在线| 亚洲欧美在线专区| 亚洲高清资源综合久久精品| 国产真实精品久久二三区| 91免费视频网站在线观看| 一区二区三区在线影院| av大片在线看| 色哟哟入口国产精品| 在线观看欧美理论a影院| 国产精品视频福利| 国产传媒日韩欧美成人| 男女午夜网站| 欧美日韩视频一区二区| 日本美女久久| 川上优av一区二区线观看| 蜜桃av一区二区三区| 69久久久久久| 91精品国产aⅴ一区二区| 国产欧美自拍一区| 精品久久久久久久久久久院品网 | 亚洲国产aⅴ成人精品无吗| 日韩欧美在线观看一区二区| 亚洲精品在线观看视频| 成人爽a毛片免费啪啪红桃视频| 国产精品久久久久av免费| 久久综合五月| 五月亚洲综合| 日韩欧美色综合网站| 成人在线视频中文字幕| 欧美理论一区二区| 亚洲国产激情av| 中文字幕在线观看网站| 欧美亚洲日本黄色| 毛片av中文字幕一区二区| 一本免费视频| 日韩av在线网站| 日韩精品午夜| 日本免费不卡一区二区| 欧美日韩国产电影| 国产精品x8x8一区二区| 亚洲视频导航| 一本到不卡免费一区二区| 日韩一二三区在线观看| 性欧美videosex高清少妇| 天涯成人国产亚洲精品一区av| 成人国产精品一区二区免费麻豆| 国产91视觉| 国产欧美一区二区三区沐欲| 美女精品视频| 91成人在线看| 亚洲视频一区二区在线| 成人日韩在线| 另类视频在线观看+1080p| 一区二区三区在线观看网站| 亚洲二区av| 国产又爽又黄ai换脸| 欧美色网一区二区| 激情婷婷综合| 欧美一级黄色影院| 伊人久久久久久久久久久久久| 中文一区在线| 欧美新色视频| 国产精品丝袜久久久久久高清| 国产日韩精品视频一区| 成人国产激情在线| 中文字幕综合在线观看| 日韩视频免费观看高清完整版| 午夜精品影院| 污黄色在线观看| 国产精品久久一区主播| 自拍视频在线观看一区二区| 国产一区二区三区视频在线| 天天在线免费视频| 亚洲国产精品字幕| 日本少妇一区二区| 成人毛片av在线| 久久久久久久免费| 欧美三区免费完整视频在线观看| 久久综合国产| 尤物免费看在线视频| 日韩av免费看网站| 亚洲男同性视频| 日韩三级av| 免费羞羞视频| 日本91av在线播放| 亚洲青青青在线视频| 四虎884aa成人精品最新| 无套内精的网站| 国内精品视频久久| 国产精品美女一区二区在线观看| 蜜桃在线一区| 成人黄网大全在线观看| 69影院欧美专区视频| 中文字幕一区二区三区乱码在线 | 国产成人亚洲综合| 国产精品久久久99| 色老板在线视频一区二区| 久久撸在线视频| 欧美亚洲国产成人精品| 亚洲国产裸拍裸体视频在线观看乱了 | 国产日韩欧美a| 澳门久久精品| 国产精品久久久久久精| 国产精品视频精品| 午夜激情久久久| 亚洲国产一区二区三区高清| 成人免费在线| 男人日女人的bb| 永久免费精品影视网站| 91免费看`日韩一区二区| 国产美女撒尿一区二区| 爱爱免费视频网站| 亚洲精品欧美日韩专区| 日韩一二在线观看| av网站免费线看精品| 伦理一区二区三区| 天堂а√在线8种子蜜桃视频 | 最新av在线播放| 国产又粗又猛又爽又黄的网站| 美日韩精品视频免费看| 亚洲午夜在线视频| 99视频在线精品国自产拍免费观看| 欧美精品videosex| 国产原创popny丨九色| 国产精国产精品| 日韩一二三区不卡| 97se亚洲国产综合自在线| 日韩精品欧美激情一区二区| 免费黄网站在线播放| 精品久久久久久久久久中文字幕| 亚洲 日韩 国产第一| 欧美日韩黄视频|