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

來聊聊一個輕量級的有限狀態機:Cola-StateMachine

開發
本文將用常見的下單流程演示一下 Cola-StateMachine 的基本使用,希望對你有幫助。

簡單研究了一下研究了一下市面上的幾個狀態機框架,包括但不限制于Spring Statemachine以及Cola-StateMachine,考慮到前者上下文會記錄當前狀態機的相關屬性(當前狀態信息、上一次狀態),對此我們就必須要通過工廠模式等方式規避這些問題,很明顯這種方案對于高并發場景下非常不友好。

于是筆者選用了更加輕量級的無狀態狀態機框架Cola-StateMachine,而本文將用常見的下單流程演示一下Cola-StateMachine的基本使用,希望對你有幫助。

一、狀態機基本概念掃盲

狀態機通俗來說就是有限狀態機(Finite-state machine,FSM),我們可以將其理解為一個數學模型,有限狀態以及這些轉臺之間轉移和動作行為的抽象的數學模型。

我們以一個簡單的開關燈為例子簡單介紹一下狀態機的基本概念,當我們點擊開時電燈就會亮起狀態就是open,按照狀態機的幾個核心概念:

  • 當我們準備按下開關時,這個準備按下開關也就是需要執行的指令,也就是事件event。
  • 實際按下開關的執行動作也就是狀態機中的動作(action)。
  • open就是狀態機中的狀態(state)。
  • 電燈由暗變亮,這個就是所謂transition也就是狀態的轉換,這就是狀態機的最后一個概念。

二、基于Cola-StateMachine落地下單業務

1. 業務流程說明

現在我們就以一個訂單為例子介紹一下狀態機的進階使用,如下圖:

  • 初始狀態下訂單狀態為待支付。
  • 用戶點擊付款之后會觸發已付款事件。
  • 此時訂單的狀態就會變為代發貨。
  • 商家完成發貨之后觸發已發貨事件,此時訂單變為待收貨。
  • 最終,買家收獲之后觸發已收貨事件,訂單變為終態已完成。

2. 狀態機落地

基于上述需求我們進行代碼落地,首先定義訂單狀態枚舉,代碼如下所示,該枚舉將交由后續狀態機進行狀態扭轉的和事件的映射配置:

public enum OrderStatusEnum {
    WAIT_PAYMENT(0, "待支付"),
    WAIT_DELIVER(1, "待發貨"),
    WAIT_RECEIVE(2, "待收貨"),
    FINISH(3, "完成");

    private int code;
    private String description;

    OrderStatusEnum(int code, String description) {
        this.code = code;
        this.description = description;
    }
 //get set......

}

然后就是事件枚舉,如上圖所說,筆者分別定義了買家已支付事件、商家已發貨事件和買家已收貨的3個事件枚舉:

public enum OrderEventEnum {

    PAYED(0,"已支付"),
    DELIVERY(1,"已發貨"),
    RECEIVED(2,"已收貨");

    private int code;
    private String description;

    OrderEventEnum(int code, String description) {
        this.code = code;
        this.description = description;
    }
 //get set ......
}

為了簡潔且方便的演示實際業務持久化的場景,筆者通過一個ConcurrentHashMap模擬數據庫存儲:

@Component
public class OrderMapper {
    private Map<Long, Order> orders = new ConcurrentHashMap<>();

    public void put(Long id, Order order) {
        orders.put(id, order);
    }

    public Order get(Long id) {
        return orders.get(id);
    }

    public Map<Long, Order> getOrders() {
        return orders;
    }
}

重點來了,接下來就是訂單狀態扭轉和事件的綁定,這里筆者簡單說明一下,Cola-StateMachine進行配置初始化時,是通過內置的StateMachineBuilderFactory進行創建。

我們指明狀態和事件類型為上文所述的OrderStatusEnum和OrderEventEnum,以及實際操作的對象是訂單類order,通過externalTransition進行對應狀態扭轉和事件配置。

我們以第一條配置為例,當我們觸發PAYED即買家已支付事件時,狀態會從WAIT_PAYMENT待支付變為待發貨WAIT_DELIVER,同時為了明確我們的訂單是否是由待支付變為代發貨,筆者通過when函數校驗一下對訂單狀態進行了一下校驗。

明確之后狀態源狀態是待支付之后,這條配置執行perform的動作(Action),即將訂單狀態改為待發貨,然后將訂單最新的狀態持久化入庫。

而其他配置同理,讀者可參考注釋自行了解:

@Component
public class OrderStatusMachineConfig {

    @Autowired
    private OrderMapper orderMapper;

    @Bean
    public StateMachine stateMachine() {
        StateMachineBuilder<OrderStatusEnum, OrderEventEnum, Order> builder = StateMachineBuilderFactory.create();
        builder.externalTransition()
                .from(OrderStatusEnum.WAIT_PAYMENT)//從待支付
                .to(OrderStatusEnum.WAIT_DELIVER)//變為待發貨
                .on(OrderEventEnum.PAYED)//需要通過支付事件
                .when(o -> o.getOrderStatus().equals(OrderStatusEnum.WAIT_PAYMENT))//判斷條件為傳入的訂單是待支付的
                .perform((f, t, e, o) -> {
                    System.out.println("將" + JSONUtil.toJsonStr(o) + " 由狀態 " + f.getDescription() + " 變為 " + t.getDescription());
                    //上述要求符合后執行將狀態修改為代發貨,并持久化
                    o.setOrderStatus(OrderStatusEnum.WAIT_DELIVER);
                    orderMapper.put(o.getOrderId(), o);
                });


        builder.externalTransition()
                .from(OrderStatusEnum.WAIT_DELIVER)//從待發貨
                .to(OrderStatusEnum.WAIT_RECEIVE)//變為待收獲
                .on(OrderEventEnum.DELIVERY)//通過發貨事件
                .when(o -> true)//沒有需要考慮的條件
                .perform((f, t, e, o) -> {//修改訂單狀態并持久化入庫
                    o.setOrderStatus(OrderStatusEnum.WAIT_RECEIVE);
                    orderMapper.put(o.getOrderId(), o);
                    System.out.println("將" + JSONUtil.toJsonStr(o) + " 由狀態 " + f.getDescription() + " 變為 " + t.getDescription());
                });

        builder.externalTransition()
                .from(OrderStatusEnum.WAIT_RECEIVE)//從待收貨
                .to(OrderStatusEnum.FINISH)//到已完成
                .on(OrderEventEnum.RECEIVED)//通過收獲事件觸發
                .when(o -> true)//無需任何條件校驗
                .perform((f, t, e, o) -> {
                    //修改狀態并持久化
                    o.setOrderStatus(OrderStatusEnum.FINISH);
                    orderMapper.put(o.getOrderId(), o);
                    System.out.println("將" + JSONUtil.toJsonStr(o) + " 由狀態 " + f.getDescription() + " 變為 " + t.getDescription());
                });

        return builder.build("orderStateMachine");
    }

}

完成上述配置后,我們就可以在業務代碼上使用這套狀態機了,我們在開發買家支付方法時,只需將狀態機注入,然后調用狀態機的fireEvent方法,傳入訂單的源狀態、事件枚舉、訂單信息,讓狀態機根據我們的狀態和事件進行判斷,并完成狀態修改和持久化:

對應代碼如下,讀者參考注釋閱讀:

@Service
public class OrderService {

    @Autowired
    StateMachine<OrderStatusEnum, OrderEventEnum, Order> stateMachine;

    private AtomicLong id = new AtomicLong(0);
    @Autowired
    private OrderMapper orderMapper;


    public Order create() {
        //創建訂單
        Order order = new Order();
        //初始化狀態為待支付
        order.setOrderStatus(OrderStatusEnum.WAIT_PAYMENT);
        //分配id
        order.setOrderId(id.incrementAndGet());
        orderMapper.put(order.getOrderId(), order);

        System.out.println("訂單創建成功:" + JSONUtil.toJsonStr(order));

        return order;
    }


    public void pay(long id) {
        //查詢訂單
        Order order = orderMapper.get(id);
        System.out.println("準備下單,訂單號:" + id);
        //生成事件消息,希望將訂單狀態改為已支付,并存入當前訂單數據
        stateMachine.fireEvent(order.getOrderStatus(), OrderEventEnum.PAYED, order);

    }


    public void deliver(long id) {
        Order order = orderMapper.get(id);
        System.out.println("準備給訂單發貨,訂單號:" + id);
        //傳入訂單,并觸發發貨事件,成功后訂單狀態會改為待收貨
        stateMachine.fireEvent(order.getOrderStatus(), OrderEventEnum.DELIVERY, order);
    }


    public void receive(long id) {
        Order order = orderMapper.get(id);
        System.out.println("嘗試收貨,訂單號:" + id);
        //傳入訂單,并觸發收貨事件,將訂單修改為已完成
        stateMachine.fireEvent(order.getOrderStatus(), OrderEventEnum.RECEIVED, order);
    }

    public Map<Long, Order> getOrders() {
        return orderMapper.getOrders();
    }


}

3. 最終效果演示

最后我們給出并發的測試用例:

CountDownLatch countDownLatch = new CountDownLatch(2);
        new Thread(() -> {
            orderService.create();
            orderService.pay(1L);
            orderService.deliver(1L);
            orderService.receive(1L);
            countDownLatch.countDown();
        }).start();


        new Thread(() -> {
            orderService.create();
            orderService.pay(2L);
            orderService.deliver(2L);
            orderService.receive(2L);
            countDownLatch.countDown();
        }).start();
        countDownLatch.await();

        System.out.println("訂單處理完成:" + JSONUtil.toJsonStr(orderService.getOrders()));

可以看到訂單都完成了:

訂單創建成功:{"orderId":1,"orderStatus":"WAIT_PAYMENT"}
訂單創建成功:{"orderId":2,"orderStatus":"WAIT_PAYMENT"}
準備下單,訂單號:1
準備下單,訂單號:2
將{"orderId":1,"orderStatus":"WAIT_PAYMENT"} 由狀態 待支付 變為 待發貨
將{"orderId":2,"orderStatus":"WAIT_PAYMENT"} 由狀態 待支付 變為 待發貨
準備給訂單發貨,訂單號:1
準備給訂單發貨,訂單號:2
將{"orderId":1,"orderStatus":"WAIT_RECEIVE"} 由狀態 待發貨 變為 待收貨
將{"orderId":2,"orderStatus":"WAIT_RECEIVE"} 由狀態 待發貨 變為 待收貨
嘗試收貨,訂單號:2
嘗試收貨,訂單號:1
將{"orderId":2,"orderStatus":"FINISH"} 由狀態 待收貨 變為 完成
將{"orderId":1,"orderStatus":"FINISH"} 由狀態 待收貨 變為 完成
訂單處理完成:{"1":{"orderId":1,"orderStatus":"FINISH"},"2":{"orderId":2,"orderStatus":"FINISH"}}

三、小結

自此我們通過Cola-StateMachine完成一個簡單的案例快速入門了狀態機的使用,希望對你有幫助。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2024-01-08 09:46:47

2022-03-06 19:57:50

狀態機easyfsm項目

2013-09-03 09:57:43

JavaScript有限狀態機

2021-04-29 09:31:05

前端開發技術

2021-09-07 06:40:26

狀態機識別地址

2014-05-21 11:09:56

前端有限狀態機

2019-12-13 19:00:26

PekwmLinux桌面

2025-06-04 01:55:00

2023-04-12 07:14:31

Spring應用業務

2022-06-06 22:23:26

Tina工具Markdown

2023-06-28 08:16:50

Autofac應用程序

2021-10-27 11:29:32

框架Web開發

2025-04-14 09:30:11

Spring狀態機訂單

2025-06-27 10:41:04

Redis數據庫集群

2021-07-08 09:15:20

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

2021-01-05 08:35:24

GNU nanoVim編輯器

2023-03-06 07:35:30

狀態機工具訂單狀態

2025-01-09 08:00:00

Fluxy文件傳輸

2022-08-31 12:48:48

TinyDBPython數據庫

2020-08-27 11:39:05

JavaRESTful Web編程語言
點贊
收藏

51CTO技術棧公眾號

国产成人精品免费视频网站| 欧美极品另类videosde| 色综合久综合久久综合久鬼88 | 成人羞羞视频免费看看| 亚洲青涩在线| 欧美成人四级hd版| 女子免费在线观看视频www| 一区二区三区在线影院| 国产在线播放观看| 国产欧美在线| 国产一区二区视频在线观看| 麻豆视频久久| 亚洲人成在线观看| av电影高清在线观看| 五月激情六月综合| 中文字幕av不卡在线| 懂色av一区二区三区蜜臀 | 91精品国产91久久久久久久久| 超碰在线资源| 欧美日韩黄色一区二区| 678五月天丁香亚洲综合网| 四虎影视av| 99久久综合精品| 亚洲激情一区二区三区| 亚洲国产高清一区| 亚洲自拍偷拍第一页| 精品久久久中文字幕| 久久久久亚洲精品| 农村妇女一区二区| 亚洲人成在线电影| а√天堂中文资源在线bt| 91精品国产综合久久婷婷香蕉| 无线免费在线视频| 一区二区三区四区不卡在线| 香蕉521av成人网| 国产三级精品在线| 久久综合久久色| 91麻豆精品在线观看| 欧美这里只有精品| 国内一区二区视频| 糖心vlog在线免费观看| 国产综合成人久久大片91| 一本一道久久久a久久久精品91 | 成人免费视频视频| 日本一级黄视频| 国产精品99久久久久久久女警| 日韩区国产区| 日韩国产欧美在线视频| 一区二区精品免费视频| 国产成人免费在线视频| 国产青青在线视频| 欧美极品另类videosde| 日韩一区二区在线视频| 3344国产永久在线观看视频| 亚洲精品久久久久| 中文字幕系列一区| 欧美日韩成人黄色| 国产福利电影网| 国产成人av毛片| 国产精品第1页| 91精品91| 亚洲成人第一| 成熟亚洲日本毛茸茸凸凹| 国产免费成人在线| 亚洲人xxxx| 黄色免费在线播放| 精品盗摄一区二区三区| 国产成人精品一区二三区在线观看| 欧美另类精品xxxx孕妇| 成人羞羞网站| 茄子视频成人在线观看 | 日韩电影免费一区| 26uuu成人| 国产调教视频一区| 中文字幕大看焦在线看| 日韩亚洲欧美一区二区三区| 全球最大av网站久久| 91av在线免费观看| 欧美一区久久| 99久久99久久精品| 亚洲欧美日韩国产另类专区| 天堂中文8资源在线8| 中文字幕国产精品久久| 国产精品欧美日韩一区| 亚洲在线视频免费观看| 香蕉视频在线看| www国产精品视频| 日韩黄色大片| av磁力番号网| 一区二区三区久久| 欧美激情成人动漫| 91a在线视频| 久久精品道一区二区三区| 日本免费不卡一区二区| 欧美午夜久久久| 成人mm视频在线观看| 91免费人成网站在线观看18| 国产在线精品视频| 最色在线观看| 在线看日韩欧美| 欧美一区影院| 欧美精品色婷婷五月综合| 91成人看片片| 外国成人毛片| 好看的日韩精品视频在线| 国产亚洲1区2区3区| www在线观看播放免费视频日本| 美女撒尿一区二区三区| 99精品视频网| 美女视频免费观看网站在线| 国产丝袜一区二区三区免费视频 | 50度灰在线观看| 五月激情综合婷婷| 亚洲ww精品| 日本在线成人一区二区| 亚洲久本草在线中文字幕| 忘忧草在线日韩www影院| 国产欧美一区二区白浆黑人| caoporn国产精品| 婷婷丁香在线| 51精品国产人成在线观看| 亚洲国产精品t66y| 在线毛片观看| 国产精品播放| 亚洲国产毛片aaaaa无费看| 99在线热播| 亚洲天堂福利av| 欧美videos粗暴| 亚洲欧美日韩在线综合| 极品粉嫩饱满一线天在线| 日韩在线www| 青青草国产成人99久久| 国产美女性感在线观看懂色av| 97在线视频一区| 99久久99久久精品免费观看| 不卡视频观看| 欧美日韩最好看的视频| 欧美日韩精品一区二区三区 | 91九色偷拍| 夜夜嗨av一区二区三区中文字幕| 粉嫩av一区二区三区四区五区 | 国产在线98福利播放视频| 日本一区二区三级电影在线观看| 校园春色亚洲| 伊人久久av导航| 日韩欧美色电影| 国产精品尤物| 天堂中文8资源在线8| 成人h视频在线观看| 欧美视频在线看| 中文字幕日韩一区二区不卡| 一二三区在线| 91精品视频在线| 色综合一区二区三区| 在线中文字幕第一区| 欧美日本韩国一区二区| 不卡一区二区三区四区五区| 欧美综合一区二区| 国产精品日韩欧美一区| www免费视频观看在线| 日韩精品免费观看| 欧美freesex8一10精品| 日韩av片网站| 91wwwcom在线观看| 一区二区视频免费在线观看| 91久久国产综合久久蜜月精品| 91麻豆产精品久久久久久| av在线资源网| 91久久极品少妇xxxxⅹ软件| 精品成人av一区| 久久影视一区| 黄色软件在线观看| www.久久艹| 欧美日韩精品一二三区| 伊人色**天天综合婷婷| 欧美日韩国产综合视频| 亚洲在线视频观看| 欧美三级日韩三级国产三级| 国产精品视频| 国产精品一品| 亚洲色成人www永久在线观看| 精品国内产的精品视频在线观看| 91丨九色porny丨蝌蚪| 久久porn| 在线观看中文字幕| 精品国产一区二区三| 污片在线免费看| 亚洲视频在线观看| 久久网站最新地址| 日本一道高清一区二区三区| 粉嫩欧美一区二区三区 | 六月婷婷综合| 日本香蕉视频在线观看| 精品中文字幕在线2019| 洋洋av久久久久久久一区| 国产综合久久| 欧美极度另类| ckplayer中文字幕| 国产亚洲精品久久飘花| 亚洲色图校园春色|