• 首页
  • 热点
  • 财经
  • 要闻
  • 经济
  • 快讯
  • 科技
  • 滚动
  • 行业
  • 教育
  • 综合
logo
  • 中陕网首页 >
  • 中陕网 > 行业 >
  • 正文

聊聊Cola-StateMachine轻量级状态机的实现

2023-06-07 12:14:16 来源:博客园
背景

在分析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。

关闭订单的简单流程图

关闭订单简单的状态流转图

添加依赖

    com.alibaba.cola    cola-component-statemachine    4.3.1

定义一个订单的实体类、订单状态的枚举值、订单事件的枚举值

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

在容器启动的时候注册一个订单状态变更的工厂

@Componentpublic class StateMachineBuilderConfig {    @Autowired    UserCloseAction userCloseAction;    @Bean("orderOperaMachine")    public StateMachine orderOperaMachine() {        String ORDER_OPERA = "order_opera";        StateMachineBuilder 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 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);        };    }}

在定义一个特殊的,只是举个例子,可以通过集成的方式集成实现一个用户关单的具体操作

@Componentpublic class UserCloseAction implements Action {    @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 的操作接口

@RestControllerpublic class OrderOperaController {    @Autowired    @Qualifier("orderOperaMachine")    StateMachine 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中

最后运行下

责任编辑:

免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。如稿件版权单位或个人不想在本网发布,可与本网联系,本网视情况可立即将其撤除。

    为您推荐

  • 聊聊Cola-StateMachine轻量级状态机的实现

    Cola-StateMachine组件是一种轻量级的、无状态的、基于注解的状态机实
  • 每日关注!投诉湖北五七农研农业科技发展有限公司养殖套路

    投诉湖北五七农研农业科技发展有限公司养殖套路投诉直通车是湖南日报、
  • 快看:华灿光电:公司GaN电力电子器件产品可用于云计算大数据服务器中心

    每经AI快讯,有投资者在投资者互动平台提问:你好!请问贵公司产品是否
  • 每日热门:6月7日 11:18分 ST工智(000584)股价快速拉升

    分时图快速拉升意味此时存在大单买入,在大单的推动下,股价快速地上涨
  • 仕净科技:6月6日融资净买入715.65万元,连续3日累计净买入1360.56万元 视点

    6月6日,仕净科技(301030)融资买入1566 38万元,融资偿还850 72万元
  • 2023武汉幼儿园招生条件

    2023武汉幼儿园招生条件根据《市教育局关于做好2023年全市幼儿园招生入
  • 大和:沽空报告不会对创科实业产生财务影响 重申“买入” 环球速递

    大和发布研究报告称,基于2023年每股盈利24倍市盈率,维持创科实业(00
  • 2023年宝安区小一学位申请正式开始 附报名重要提醒_百事通

    2023年宝安区小一学位申请正式开始2023年6月7日上午9:00,2023年宝安区
  • 保送男生穿旗袍为高考同学加油 他的同学笑翻了-今日最新

    【保送男生穿旗袍为高考同学加油】6月7日,2023年夏季高考正式开启,济
  • 世界快报:3199元!英伟达RTX 4060 Ti公版显卡开启预约

    英伟达推出的RTX4060Ti8G公版显卡于5月24日正式上市,并在短时间内被抢
  • 沪深股通|亿联网络6月6日获外资卖出0.02%股份

    同花顺数据显示,2023年6月6日,亿联网络获外资卖出13 75万股,占流通
  • 西山科技上市首日涨幅超40% 募资近18亿元解“燃眉之急”

    6月6日,专注于外科手术医疗器械的西山科技在科创板上市,本次公开发行
  • 村民的戏为什么又多又烂_《云南虫谷》导演费振翔道出了苦衷_世界速看料

    为什么村民的戏那么多而且很烂?《云南虫谷》导演费阳表达了他的难处,
  • 赵长鹏和币安被美国证交会起诉,已屡次被美国监管机构调查

    雷达财经鸿途出品文|吴艳蕊编|深海北京时间6月5日晚间,赵长鹏及其加密
  • 沪深股通|键凯科技6月6日获外资卖出0.06%股份 全球热议

    同花顺数据显示,2023年6月6日,键凯科技获外资卖出2 13万股,占流通盘
  • 沪深股通|金智科技6月6日获外资买入0.13%股份

    同花顺数据显示,2023年6月6日,金智科技获外资买入51 75万股,占流通
  • 沪深股通|首航高科6月6日获外资买入0.05%股份|世界资讯

    同花顺数据显示,2023年6月6日,首航高科获外资买入119 06万股,占流通
  • 550分会上什么大学湖南文科能-世界最资讯

    1、550分会上什么大学花呗的零时额度只有双11购物的时候才有,临时额度
  • 百度竞价这几个关键词,足以月入上万|环球即时

    赚钱的核心就是发现需求,然后解决需求,我们称之为商机。众所周知,蓝
  • 迷信985211房号_家长别给商家递刀子,使“高考房”成收割家长和学生的新噱头

    原标题:迷信“985”“211”房号,家长别给商家“递刀子”余明辉据澎湃
  • 热消息:6月7日盘前重要市场新闻

    >>创业板指续创新低房地产产业链逆势活跃  A股三大指数6月6日震荡走
  • 焦点播报:首届“嘉吉杯”生态科普讲解大赛决赛圆满结束

    首届“嘉吉杯”生态科普讲解大赛决赛圆满结束为深入贯彻落实党的二十大
  • 省财政厅推出“30条”接续政策真人版视频解读 世界热点评

    省财政厅推出“30条”接续政策真人版视频解读---湖北日报讯(记者张爱
  • 三载不负终将舞 世界头条

    绘图 王末璇
  • 松江六中高中部_松江六中

    1、上海市松江区第六中学(简称松江六中),是松江区教育局直属的公办
  • 学子高考前夕遗失准考证,通城民警紧急找回 当前消息

    学子高考前夕遗失准考证,通城民警紧急找回---学子高考前夕遗失准考证
  • 全球看点:宝马加速电气化 预计到2023年将有25款带插头的车型

    宝马集团在2017年表示,计划到2025年在其所有品牌中推出25辆电动汽车,
  • 当前看点!暖气片规格型号参数详解文库_暖气片规格有多少种

    1、出厂的常用规格标准高度有300mm--1800mm,且备货较多。2、消费者可
  • 58个优秀节目同台竞技 百团百角唱新歌“云展演”启动投票

    湖湘百花竞绽放,颂歌唱响新时代。6月6日晚上8时,“贯彻二十大·百团
  • 星海公园图片_星海公园 天天热点评

    相信目前很多小伙伴对于星海公园都比较感兴趣,那么小搜今天在网上也是
  • 贵州省安顺市2023-06-04 18:16发布雷雨强风黄色预警 每日速读

    音频解说一、贵州省安顺市天气预报1、关岭县气象台2023年06月04日18时1
  • 热头条丨格林威治豪华房地产市场快照

    来自RobinKencel集团:价值6至999万美元的价格区间。此价格段中有59个
  • 热推荐:安德烈·梅尔尼琴科

    1、安德烈·梅尔尼琴科(AndreyMelnichenko),男,俄罗斯最大的独立煤
  • 金科股份:拟购买恒昇大业20%股权 股票停牌|热门

    【金科股份:拟购买恒昇大业20%股权股票停牌】金科股份(000656)6月6日
  • 噶沙糕南昌话_南昌话噶撒糕是什么意思是骂人的话吗 全球资讯

    想必现在有很多小伙伴对于南昌话噶撒糕是什么意思,是骂人的话吗方面的
  • 一代沙雕小镇夏天帮小姐姐解暑通关攻略一览

    这里为大家带来一代沙雕小镇夏天帮小姐姐解暑通关攻略一览的详细攻略,
  • 保利置业集团:前5月累计合同销售金额约333亿元,同比增长212%

    保利置业集团:前5月累计合同销售金额约333亿元,同比增长212%:保利置
  • 原创动画|考前最后一天,家长如何与考生交流

    “别想那么多!”“结果怎样没关系。”刻意回避高考话题,是不少父母在
  • 绽的形近字(绽) 环球短讯

    来为大家解答以下的问题,的形近字,绽这个很多人还不知道,现在让我们
  • 公司给员工租房子怎么做账_公司给员工租房怎么做账 当前速讯

    1、这个应该属于福利费,根据职工所在不同部门,可以将此部分费用分别
  • 上海浦东新区激励关怀社区工作者 热门

    据人民网报道,上海浦东新区近日出台了社区工作者激励关怀15条措施。据
  • 光的色散属于光的反射吗_光的色散-环球聚看点

    1、太阳光是白光,这是在太阳光在没有受到其它因素的前提下的 太阳光之
  • 天龙八部仿官服能玩吗_天龙八部仿官私服网-滚动

    1、没有不变态的私服都是100%变态的!不过要新地图的也就只有盐湖其他
  • 摩尔庄园手游小镇怎么解锁(小镇解锁方式介绍)|全球微资讯

    导读综合小编来为大家讲解下摩尔庄园手游小镇怎么解锁,小镇解锁方式介
  • 当地时间6月6日,乌克兰国家通讯社报道称,乌克兰国家安全与国防委员会秘书丹尼洛夫就有关扎波罗热核电站是否存在风险问题时表示,目前扎波罗热核电站局势很复杂,但可控,核电站辐射在正常范围内

    当地时间6月6日,乌克兰国家通讯社报道称,乌克兰国家安全与国防委员会
  • 广州开展“百企千人”实习计划 向港澳青年学生提供近两千实习岗位_环球即时看

    据南方日报消息,10多家用人单位携超200个实习岗位现场进行招聘面试,
  • 热点评!美股异动丨Mobileye跌超2% 英特尔将出售公司部分持股 套现约15亿美元

    格隆汇6月6日丨Mobileye(MBLY US)跌2 41%,报41 35美元,总市值333亿美
  • 世界看热讯:240分上什么学院大好理综水平

    1、240分上什么学院只能去职业学院广西对口240能上的学校基本就是广西
  • 当前快看:吉林师范大学博达学院有哪些专业 吉林师范大学博达学院专业排名

    吉林师范大学博达学院最好的专业排名榜(附第一与前十名的专业名单)吉
  • 焦点讯息:饥荒联机版怎么复活队友(饥荒联机版怎么复活)

    1、问:《饥荒》联机版如何复活?答:  第一种,如果离得并不远,可
  • 推荐几款轿车,优先考虑德系和自主

    麻烦推荐几款轿车,底盘质感好,驾乘质感好,内饰有档次,有越级感的,
  • 杭州十条河道开放水上运动,市民可划皮艇、赛龙舟

    杭州十条河道开放水上运动,市民可划皮艇、赛龙舟杭州市民可以在家附近
  • 上影节《大李小李和老李》加场了 6月8号12点可“抢购”这5部新增影片 天天快讯

    东方网记者熊芳雨6月6日报道:记者获悉,第二十五届上海国际电影节将新
  • 时空猎人官网银汉中心(时空猎人怎么赚钱)-全球热推荐

    1、在《时空猎人》游戏中的非R玩家来说,赚钱是非常要紧的一件事情。2
  • 辅酶q10的作用与功效备孕_辅酶q10的作用 世界热讯

    1、作用是相当广泛的辅酶Q10的美肤作用:1,辅酶Q10为人体自身合成新的
  • 年轻人行走职场,要小心这六种同事,不仅混的差,还频繁吃亏 天天快讯

    在一个企业里,除了老板和上司,最让你接触最多的就是同事。同事不仅影

相关推荐

  • 2023年宝安区小一学位申请正式开始
  • 保送男生穿旗袍为高考同学加油 他
  • 世界快报:3199元!英伟达RTX 4060
  • 沪深股通|亿联网络6月6日获外资卖出
  • 西山科技上市首日涨幅超40% 募资近
  • 村民的戏为什么又多又烂_《云南虫谷
  • 赵长鹏和币安被美国证交会起诉,已
  • 沪深股通|键凯科技6月6日获外资卖出
  • 沪深股通|金智科技6月6日获外资买入
  • 沪深股通|首航高科6月6日获外资买入

阅读排行

  • 聊聊Cola-StateMachine轻量级状态机的实现
  • 每日关注!投诉湖北五七农研农业科技发展有限公司养殖套路
  • 快看:华灿光电:公司GaN电力电子器件产品可用于云计算大数据服务器中心
  • 每日热门:6月7日 11:18分 ST工智(000584)股价快速拉升
  • 仕净科技:6月6日融资净买入715.65万元,连续3日累计净买入1360.56万元 视点
  • 2023武汉幼儿园招生条件
  • 大和:沽空报告不会对创科实业产生财务影响 重申“买入” 环球速递
  • 2023年宝安区小一学位申请正式开始 附报名重要提醒_百事通
  • 保送男生穿旗袍为高考同学加油 他的同学笑翻了-今日最新
  • 世界快报:3199元!英伟达RTX 4060 Ti公版显卡开启预约

联系方式:291 32 36@qq.com

Copyright © 1998-2023 by 中陕网版权 所有 京ICP备12018864号-5

营业执照公示信息