聊聊Cola-StateMachine轻量级状态机的实现
在分析Seata的saga模式实现时,实在是被其复杂的 json 状态语言定义文件劝退,我是有点没想明白为啥要用这么来实现状态机;盲猜可能是基于可视化的状态机设计器来定制化流程,更方便快捷且上手快吧,毕竟可以通过UI直接操作,设计状态流转图,但我暂时不太能get到。对于Saga模式的实现,之前的博文中已经阐述了基于状态机模式实现Saga,是比较常见且合适的做法,因此了解了下Java中的状态机实现方案,以后有相关的业务场景也可以直接上手使用状态机。
Cola-StateMachineCola-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轻量级状态机的实现
- 海南税务:个人股权转让涉税业务实现网上办理
- 惠誉下调美国不动产相关产业评级展望至恶化
- 人工智能数据分析平台【Beehive AI】 完成510 万美元种子轮融资,Valley Capital领投-环球看热讯
- 丹阳属于哪个市哪个区_丹阳属于江苏的哪个市_前沿资讯
- 张燕个人资料及图片_拜伦斯科特个人资料和图片 观热点
- 创新课程50字初中生_创新课程50字|新要闻
- 安德森短篇小说全集-全球播资讯
- 16所高职院校河源竞技
- 仰望星空 脚踏实地 用行动诠释使命担当 ——记连平县人民检察院第一检察部主任张旖旎
- 戴上2万5的苹果头显,我只看到了库克的焦虑
- 戴上2万5的苹果头显,我只看到了库克的焦虑
- 和评理 | 操弄“台湾牌”挑衅中国 美国愚蠢且短视
- 我是城市美容师的工作职责_美容师的工作职责 天天视点
- 长沙周边城市_长沙周边_今日最新
- 据菲律宾媒体5日报道,菲海关局发布《区域全面经济伙伴关系协定》(RCEP)下关于实施特别关税的条件规定
- “奔跑”的大项目丨国内硫化氢含量最高的整装气田在川全面达产,是如何突破技术关的?
- 男子驾车意外坠河 民警掰车门救人
- 502胶水耐高温多少°c_502胶水耐多少度的高温 天天快播
- cdr基础的知识 cdr入门基础知识
- crazygames游戏_like crazy
- 环球新资讯:拼多多多多进宝怎么玩_拼多多怎么玩
- 焦点快报!空腹吃苹果的功效与作用 空腹吃苹果
- 天天快看:宁德时代早盘一度下跌超5%,否认与特斯拉北美供应链合作生变
- 全球微资讯!深耕"全价值链减碳" 宝马中国发布首份可持续发展报告
- 世界讯息:十堰多个小区被曝光!因为这事儿
- 资讯:*ST太安: 中兴华会计师事务所(特殊普通合伙)关于广东太安堂药业股份有限公司2022年度年报问询函的专项说明
- 全球实时:Avatrade爱华竟然请到百米飞人博尔特当品牌大使!
- 能科科技(603859)6月6日主力资金净卖出366.79万元 环球信息
- 2024年本命年适合结婚吗 万事需考虑周全 每日播报
- hd7610m黑苹果_hd7610
- 大生活家 | 牛啤堂堂主小辫儿:人各有啤,你是哪种啤?
- 国产小号乐器什么牌子好_小号乐器什么牌子好
- 信用卡逾期严重后果是什么?信用卡逾期10天严重吗?
- 名校“天团”为河南考生加油——南京大学 世界焦点
- 【全球报资讯】长宁又一美丽街区——“荟水天中”正式开园!
- 世界快看点丨创意微视频|中国空间站:神十五,再见!神十六,你好!
- 红米redmi86寸电视评测(Redmi MAX 86寸电视体验)
- 焦点速看:直击WWDC23:Vision Pro 标志着“空间计算”的开始
- gms服务是什么_有什么意义
- 微型磁控胶囊有望替代内窥镜检查 每日热讯
- 焦点速读:天下本无事庸人自扰之的意思_天下本无事庸人自扰之什么意思
- 猫咪跑步时,为什么会把耳朵夹起来?
- 焦点速读:汉寿县龙阳镇银水路小学_关于汉寿县龙阳镇银水路小学简述
- 所到之处皆为传奇!巴黎&曼联致敬伊布:国王&独一无二
- 信用债改善难掩短期配置压力,多只债基暂停大额申购,关注未来稳增长政策持续性|世界头条
- 环球速看:嘉凯城收深交所退市告知书,拟决定终止其股票上市交易
- 消息!山西省基础研究计划(自由探索类)资助项目公示
- 事关6G,工信部明确了
- 天天热点评!金属资源10强排行榜_6月5日概念股票成交额排名
- 【速看料】北京杨大平做拉皮手术效果好吗?医生简介、坐诊医院划重点
- 发挥名校示范引领 助推西咸新区教育发展|即时看
- 宝马320li时尚型怎么样?性能豪华、用户评价火爆!
- 全球焦点!我国民用无人机领域首项强制性国家标准正式发布
- 乌龟冬眠结束时间_乌龟冬眠时间
- 观天下!全国城市生活垃圾分类专题晚会《奋进在文明的征程中》6月5日北京卫视播出
- 当前速递!光大证券(601788)6月5日主力资金净买入1549.25万元
- 每日观察!全国科技小记者联盟在张家界市开展科普研学考察调研
- 今年流行这“4款”上衣,既洋气又显瘦,领口又长,你有多少?_世界微速讯
- 夏日乌梁素海
- 中信证券:维持理想汽车-W买入评级 首次实现百亿月收入
- 柠檬水能长期喝吗 这个问题你是否了解过优质
- 垃圾分类,从小做起!文晖街道和平苑社区携萌娃讲环保
- 十大私服版本传奇手游合集 热门私服传奇手游推荐一览
- 河南省“三夏”工作专题视频调度会召开-焦点资讯
- 择校生和非择校生是什么意思(择校生是什么意思)
- 【天天快播报】巴黎举办“听写大赛”,香榭丽舍大道改为“考场”
- 世界热资讯!印度比哈尔邦一座在建大桥倒塌
- “BMW中国文化之旅传统手工艺文创设计大赛”正式启动
- 当前看点!厦门海西晨报漫画_厦门海西晨报
- 世界速看:祈り(关于祈り介绍)
- 焦点播报:三高企业有哪些企业_三高企业
- 作业长值班长年终总结(作业长)
- 【天天时快讯】建设银行手机网银怎么开通_手机网银怎么开通
- 当前观察:有色金属材料与工程(关于有色金属材料与工程介绍)
- 生姜片可以去痘印吗_生姜片刺激皮肤吗 天天新动态
- Temu对入库商品退货拥有最终解释权
- 据印度媒体6月4日报道,印度铁道部长阿什维尼·维什瑙表示,铁路安全专员已经就印度列车脱轨相撞事故进行调查并发布了调查报告,确定了事故发生的原因和相关责任人 短讯
- 天天观点:什么睫毛膏纤长浓密效果好(推荐4款优秀睫毛膏)
- 李晓芳 上海师范大学马克思主义学院副院长_李晓芳 上海师范大学马克思主义学院副院长-全球新消息
- 国网石首市供电公司“电”亮绿色经济,为企业降成本“支招”-全球微资讯
- 我国载人飞船黑障区跟踪测量取得重大突破
- cumlouder在线观看 cumlouder
- 唤醒心中的少年,跟着木偶版《小王子》遨游B612星球
- 淘宝虚拟店铺怎么开通_淘宝虚拟店铺怎么开
- 青少年心理健康的标准是什么呢_青少年心理健康的标准 热点评
- 天天热文:茂名|关于理性选择校外培训的倡议书
- 中国股市或迎来结构性重估机会 摩根大通对券商和保险持积极态度-独家
- 湖北竹溪县“送技上门”助推产业振兴
- 世界最新:高可靠车规级电感 科达嘉为新能源汽车车载DCDC转换器提供低损耗
- 意大利金融专家:美债危机影响他国金融稳定 去美元化加速|世界今日报
- 世界时讯:花蚬子怎么炒好吃 鲜香扑鼻炒花蚬家常做法
- 天天微动态丨魔兽世界伤害数字不显示_魔兽世界伤害数字不见
- 多动症儿童心理辅导ppt(多动症儿童心理辅导) 天天快播
- 意大利金融专家:美债危机影响他国金融稳定 去美元化加速
- 拱北海关所属青茂海关查获一起旅客身藏旧手机进境案
- 农业农村部、教育部携手助推北京平谷农业中关村加速发展
- 贵州省安顺市2023-06-02 17:38发布冰雹橙色预警|环球快看
- Woj:76人球员豪斯执行430万美元球员选项
- 【环球聚看点】工厂解除劳动合同需要保存文本吗?
广告
广告
- 长治襄垣县增收11517万元 提前15天实现首季“开门红”
- 黑龙江讷河新增1例确诊4例无症状 病例详情公布
- 浙江宁波余姚奉化宁海三地开展核酸检测 结果均为阴性
- 浙江湖州南浔三处棋牌室经营者被行拘
- 那年今日 | 一张漫画涨知识之12月13日
- 在宁波乘火车跨省出行须持48小时内核酸阴性证明
- 浙江温州一地发现核酸弱阳性?复采复检结果均为阴性
- 浙江三门发现一名密接者:二次核酸检测结果均为阴性
- 贱卖的发电机 新买的制茶机——安徽水电供区改革两周年回访见闻
- 浙江杭州新增1例新冠肺炎确诊病例 为集中隔离人员
- 2022年研考在即,学硕缩招,专硕时代真的来了?
- 探访杭州核酸检测点:排队高峰多在夜间 医院24小时运转
- 浙江发挥零售药店“哨点”作用 织就疫情防控监测网
- 哈尔滨市本轮疫情首批1名确诊患者出院
- 宁波镇海第三轮全员核酸检测574181人 结果均为阴性
- 陕西新增本土确诊病例1例、境外输入无症状感染者2例
- 齐齐哈尔讷河一地调整为中风险地区
- 浙江新增新冠肺炎确诊病例75例 其中本土74例
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 黑龙江无新增确诊病例 新增本土核酸检测初筛阳性人员5例





