日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-01-08 17:10:47 210觀看
導讀背景在分析Seata的saga模式實現時,實在是被其復雜的 json 狀態語言定義文件勸退,我是有點沒想明白為啥要用這么來實現狀態機;盲猜可能是基于可視化的狀態機設計器來定制化流程,更方便快捷且上手快吧,畢竟可以通過UI直接操

背景

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

Cola-StateMachine

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

基礎模型

在Cola-StateMachine組件中有如下的抽象概念模型:Piv28資訊網——每日最新資訊28at.com

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

Cola-StateMachine鏈路圖

Piv28資訊網——每日最新資訊28at.com

業務應用示例

基于訂單業務的場景,做一個簡單的demo。Piv28資訊網——每日最新資訊28at.com

關閉訂單的簡單流程圖Piv28資訊網——每日最新資訊28at.com

Piv28資訊網——每日最新資訊28at.com

關閉訂單簡單的狀態流轉圖Piv28資訊網——每日最新資訊28at.com

Piv28資訊網——每日最新資訊28at.com

添加依賴Piv28資訊網——每日最新資訊28at.com

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

定義一個訂單的實體類、訂單狀態的枚舉值、訂單事件的枚舉值Piv28資訊網——每日最新資訊28at.com

@Data@Builderpublic 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;    }}

在容器啟動的時候注冊一個訂單狀態變更的工廠Piv28資訊網——每日最新資訊28at.com

@Componentpublic 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);        };    }}

在定義一個特殊的,只是舉個例子,可以通過集成的方式集成實現一個用戶關單的具體操作Piv28資訊網——每日最新資訊28at.com

@Componentpublic 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 的操作接口Piv28資訊網——每日最新資訊28at.com

@RestControllerpublic 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;    }}

啟動程序Piv28資訊網——每日最新資訊28at.com

Piv28資訊網——每日最新資訊28at.com

安裝UMLPiv28資訊網——每日最新資訊28at.com

Piv28資訊網——每日最新資訊28at.com

隨便新建一個uml文件,然后將啟動程序的控制臺輸出內容復制到uml中Piv28資訊網——每日最新資訊28at.com

Piv28資訊網——每日最新資訊28at.com

最后運行下Piv28資訊網——每日最新資訊28at.com

Piv28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-58908-0.html聊聊Cola-StateMachine輕量級狀態機的實現

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在 Flutter 中創建圓角圖像和圓形圖像有多少種方法?

下一篇: Java集合和泛型如何提高程序的靈活性和健壯性?

標簽:
  • 熱門焦點
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • Windows 11發布,微軟一改往常對老機型開放的態度

    距離 Windows 11 發布已經過去一周,在過去一周里,很多數碼愛好者圍繞其對 Android 應用的支持、對老機型的升級問題展開了激烈討論。與以往不同的是,在這次大
Top 主站蜘蛛池模板: 锡林浩特市| 湖北省| 乐至县| 余干县| 福建省| 北宁市| 栾城县| 辽中县| 新兴县| 嘉禾县| 儋州市| 容城县| 虞城县| 莎车县| 汤阴县| 大方县| 道真| 肇东市| 镇雄县| 定西市| 昔阳县| 涟水县| 衡山县| 中方县| 绥化市| 苏尼特左旗| 昭通市| 慈利县| 石楼县| 出国| 会东县| 独山县| 临夏县| 梁山县| 门源| 南涧| 长春市| 兴义市| 霍城县| 黑河市| 广东省|