AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

聊聊Cola-StateMachine輕量級狀態(tài)機的實現

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

背景

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

Cola-StateMachine

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

基礎模型

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

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

Cola-StateMachine鏈路圖

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

業(yè)務應用示例

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

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

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

關閉訂單簡單的狀態(tài)流轉圖e2p28資訊網——每日最新資訊28at.com

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

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

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

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

@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 {    /**     * 用戶關閉     */    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;    }}

在容器啟動的時候注冊一個訂單狀態(tài)變更的工廠e2p28資訊網——每日最新資訊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();        //訂單從初始化狀態(tài)-待發(fā)貨-狀態(tài)-轉到-關閉訂單狀態(tài)--用戶關閉        builder.externalTransitions()                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.USER_CLOSE)                .when(checkCondition())                .perform(userCloseAction);        //訂單從-初始化狀態(tài)-已發(fā)貨-待發(fā)貨--轉到-關閉訂單狀態(tài)--后臺操作人員關閉        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)-轉為-訂單關閉狀態(tài)-超時關閉        builder.externalTransition()                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.OVERTIME_CLOSE)                .when(checkCondition())                .perform(doAction());        //訂單從待發(fā)貨狀態(tài)--轉為-訂單關閉狀態(tài)-上級審批不通過關閉        builder.externalTransition()                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.CHECK_ERROR_CLOSE)                .when(checkCondition())                .perform(doAction());        //訂單從初始化狀態(tài)--轉為待發(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<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);        };    }}

在定義一個特殊的,只是舉個例子,可以通過集成的方式集成實現一個用戶關單的具體操作e2p28資訊網——每日最新資訊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("從這個狀態(tài)-【" + from.getInfo() + "】-轉為+【" + to.getInfo() + "】 的狀態(tài)");        System.out.println("上下文信息:" + context.toString());        System.out.println("中間執(zhí)行的一些操作.......");        System.out.println("用戶關閉流程完畢了");    }}

定義一個 controller 的操作接口e2p28資訊網——每日最新資訊28at.com

@RestControllerpublic class OrderOperaController {    @Autowired    @Qualifier("orderOperaMachine")    StateMachine<OrderStatusEnum, OrderEvent, Order> orderOperaMachine;    /**     * 場景1-用戶關閉訂單     *     * @return {@link Boolean}     */    @RequestMapping("userclose")    public Boolean userCloseOrder() {        //把訂單狀態(tài)改為關閉        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() {        //把訂單狀態(tài)改為關閉        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() {        //把訂單狀態(tài)改為關閉        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() {        //把訂單狀態(tài)改為關閉        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;    }}

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

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

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

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 28個SpringBoot項目中常用注解,日常開發(fā)、求職面試不再懵圈

    前言在使用SpringBoot開發(fā)中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業(yè)務的發(fā)展,組織規(guī)模的擴大,越來越多的企業(yè)開始意識到協作效率對于企業(yè)團隊的重要性,甚至是決定其在某個行業(yè)競爭中突圍的關鍵,是企業(yè)長久生存的根本。得物
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式。可以為擁有指定屬性的 HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 為什么你不應該使用Div作為可點擊元素

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

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節(jié),就能收獲擁有專業(yè)資質認證的得物鑒
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發(fā)布的朋友圈
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
Top