聊聊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中
最后运行下
标签:
相关阅读
-
原神神工天巧宝录之章如何玩?原神星之秘宝在哪里?
原神神工天巧宝录之章如何玩?〓活动时间〓2023 06 08 10:00 ~ 2023 06 29 03:59〓参与条件〓冒...
2023-06-07
精彩推荐
阅读排行
相关词
- 电视剧照亮你一共多少集?电视剧照亮你剧情简介
- 三只松鼠:社区零食店首店本月初开启内测,第一批店近期将开业-环球热点
- 简单沙盒2好玩吗 简单沙盒2玩法简介 环球信息
- 快资讯:图知道|2023高考作文你想写哪篇
- 如何修复缺少defragres.dll文件的问题_天天热推荐
- 618第一波申通件量峰值呈现“两级跳”:单日揽收6000万_天天微速讯
- 神舟kbdclass.sys蓝屏怎么排查和修复|短讯
- 日本实际工资连续13个月同比减少
- 石家庄供电公司:“智慧巡检+网格布点”全力护航高考用电|环球热资讯
- 中证500ETF易方达(510580)上涨0.7%,IC下月合约剔除分红后年化升水3.82%
- U盘一插上电脑就蓝屏问题的高效解决方法-天天热门
- 环球资讯:Win10无缘无故蓝屏死机问题的排查和修复技巧
- 《神仙道3》预下载、预约奖励及内测充值返利说明
- 《青鸾繁华录》全新资料片——甜蜜邂逅|速讯
- 海南中学高中部考点:送考家长“花式”送祝福 为考生加油打气
- 【全球报资讯】《神仙道3》今日6月7日公测 李一桐喊你来双修
- 实时:河北2023高考作文题出来啦!你会怎么写?
- 四大错误用眼行为,看看你有没有
- 关注“一老一小”,龙津街道民生工作提质提效
- 【天天快播报】年轻人首选!十万级家轿新选择,试驾朗逸新锐
- 塞拉7号官网在哪下载 最新官方下载安装地址 当前报道
- 世界观点:墨西哥西北部发生4.0级地震
- 每日速看!银川灵武市2023城区一年级预报名材料有什么
- 哈尔滨商转公需要什么条件-天天实时
- 银川推动房地产业发展的举措有哪些|天天播报
- 银川灵武市2023城区一年级预报名要注意什么|全球快讯
- 甘肃下雪高速封路了吗(持更)
- 国科微:公司的NPU已实现前端IPC最高4T算力和后端NVR/DVR 9T算力
- 贵州村超比赛时间2023|天天报道
- 世界看热讯:银川带押过户具体内容是什么
- 2023辽宁高考考点查询查询入口及查询流程
- 环球速递!兰州高速有雪吗(持更)
- 热点评!民德电子:条码识别产品在彩票投注终端已有批量应用
- 天天快资讯:铁流股份:空心电机轴目前处在客户产品开发阶段
- 世界快报:爱情名言名句优美句子,句句走心!
- U盘导致电脑蓝屏原因及解决方法 天天观速讯
- 创业板指跌逾1% DRG/DIP板块大涨 数字水印、旅游酒店走强
- 甘肃高速公路24小时服务电话查询_快报
- 提示qtcore4.dll丢失报错如何解决-当前快讯
- 动态:mfc140ita.dll损坏修复方法
- pnpsetup.dll缺失修复方法 关注
- 环球微速讯:缺少netcenter.dll如何修复
- 精选 | 早盘期货要闻汇总 6月7日周三
- 铁流股份:空心电机轴目前处在客户产品开发阶段
- Yoga蓝屏问题的一键修复软件推荐 焦点简讯
- 世界新资讯:与爱情有关的名言名句大全
- 高考首日三亚现暴雨天气 老师焦急确认考生是否到场 时快讯
- 深交所向*ST东洋发出问询函
- 哪些方法可以解决 三国志13找不到d3dx9_43.dll问题
- 每日关注!视频|海口一考生被堵滨海立交桥 交警六分钟送达考点
- 当前要闻:华晨宇长沙演唱会什么时候开始抢票?
- 【独家】《暗黑破坏神4》全事件触发攻略大全
- 学雷锋手抄报简单字少
- 环球通讯!出行注意!海南还有强降雨!
- 今日快讯:南昌市部署开展对中高风险道路运输企业实地核查工作
- 江西抚州高新区开展电线电缆专项检查行动
- 福州连江片内生是什么意思-动态
- 《魔镜物语》游吟诗人&二次觉醒功能来袭! 天天热闻
- 全球热点评!连江县初中招生主要日程安排
- 当前快播:“新发展格局下自贸试验区(港)高质量发展与对标经贸新规则”专题培训班举办
- 天天微资讯!2023海口高考成绩什么时候出?
- 江西省莲花县开展电子计价秤专项整治行动
- 江西省鹰潭市市场监管局开展食品安全专项检查-当前速递
- 【新要闻】连江县城区小学招生划片范围
- 杭州:着力打造国际会展之都 天天速递
- 世界观热点:2023厦门翔安区秋季幼升小入学办法(港澳台等适龄儿童)
- 《寂静岭2重制版》PC配置公开 最低配置i5-8400+GTX 1080-当前通讯
- 天天热推荐:南昌龙舟赛现场景区免费游抽奖活动
- 南昌龙舟赛公交接驳二线运营时间+线路图2023
- 江西省南昌市市场监管局多措并举遏制市场经营主体虚假登记行为 世界资讯
- 《光环:无限》发布新生涯军衔系统 将于6月20日上线 当前消息
- 当前快看:2023年济南槐荫区户籍幼升小小学报名时间+入口
- 2023年海口高考成绩官方查询入口 世界最新
- 每日关注!26岁网红直播喝酒去世,留下妻子和儿子,上个月刚参加完好友葬礼
- 【当前独家】宿迁22家企业亮相跨博会
- 《漫威蜘蛛侠2》官方表示将在信心十足时公布发售日期 最新快讯
- 精选!喜报!恒伦医疗科技股份有限公司获评首批“太原老字号”
- 卡普空Steam开启40周年特卖 持续到6月21日 世界时讯
- 崩坏星穹铁道银狼无限推条队怎么搭配 银狼无限推条队搭配攻略_快播报
- 乘风2023四公淘汰名单了谁?乘风2023在哪个台播出的?
- 重返未来1999拉拉泉要培养吗 拉拉泉技能资料分析
- 环球要闻:暗黑4赋能收割者之威能介绍
- 会员权益 重磅焕新丨咪咕阅读品牌升级邀你与美好故事同频_天天通讯
- 全球快资讯丨塞尔达传说王国之泪斩风羽枪✨在哪里
- 暗黑4通用装备无星之空戒指有什么特点
- 太原祥云桥主桥荷载试验顺利完成_全球讯息
- 世界时讯:RCEP对15个签署国全面生效 为区域经济一体化注入强劲动力(经济新方位)
- 环球热门:天玑8200和骁龙888哪个好
- 全球快资讯:太原市设置21个交通应急救助站
- 今日要闻!太原人注意!“养生馆”成了诈骗馆 目标专盯中老年女性
- 天玑8200相当于骁龙什么水平-每日精选
- 如何通过安全模式解决NTFS_FILE_SYSTEM蓝屏错误_滚动
- 热头条丨高考来临,这些高考类诈骗套路千万别信!
- 华为畅享60pro参数配置
- 【全球报资讯】谁遗落了“潜水靴”?“北溪”管道爆炸新线索能否让真凶浮出水面
- 最新快讯!山西推进加氢站建设,太原吕梁长治临汾先行先试
- 当前热议!哪些方法可以解决尘埃2找不到xlive.dll问题
- 出现冒险岛canvas.dll文件被损伤了应该怎么做
- Win7中atikmdag.sys蓝屏问题的解决方法
- 天玑8200和骁龙8+对比-天天聚看点
- 王国之泪海利亚盾碎了怎么版 海利亚盾修补方法介绍
- 当前关注:暗黑4觅血者的威能介绍
- 天天观焦点:applessd.sys蓝屏windows10
- 中尼两国持续加强在互联互通、经贸投资、能源开发等领域务实合作 “携手共同建设更加美好的未来”(第一现场)
- 焦点热议:彻底实现本土化,红杉全球宣布三大区域将各自完全独立
- 外国csgo有哪些开箱平台 最专业正规的csgo饰品交易平台排名
- 美国童工问题触目惊心 多州却进一步放宽童工法律限制
- 滞困异星黎明EXTRA-TERRESTRIAL种子是什么
- 山西省交通运输厅又一民生实事落地,普货驾驶员从业资格证可直接申领
- 天天观察:市场监管总局:今年5月,11家车企共召回汽车超118万辆
- 随笔:美国“航行自由”的“神逻辑”-焦点
- 全球通讯!@太原人,预计未来三天山西省以晴到多云天气为主,6月7日太原最高气温31℃
- 【线路信息】太原公交865路恢复原线通行
- 汉字找茬王唤醒大郎怎么过 唤醒大郎关卡通关攻略_天天快资讯
- 全球今亮点!如何处理 红色警戒3找不到d3dx9_35.dll问题
- 环球实时:中国中免:存货周转率的变化主要是海南地区为销售旺季备货所致
- 我国牵头编制的零碳电力系统等三本国际标准化白皮书正式发布 天天报资讯
- 呼伦贝尔草原地带首次发现赭石岩画 今头条
- 蒋万安:两岸紧张双城论坛更显重要 有意义_每日播报
- 环球热门:越夜越精彩!海口火力全开
- 修复spfileq.dll缺失的最佳方案
- 虚拟数字人热度攀升 多家A股公司前瞻布局
- 联动科技:6月6日融资买入2182.02万元,融资融券余额8798.51万元-今日关注
- 经纬股份:6月6日融资买入999.55万元,融资融券余额3536.12万元
- 618火热来袭 券商看好消费股布局机遇 当前关注
- 快讯:如何修复联想ThinkPad蓝屏死机后无法开机的问题
- 世界速讯:wwdc23是什么意思
- 海南税务:个人股权转让涉税业务实现网上办理|今日快讯
- 骁龙7gen1增强版什么水平
- 商界奇迹首富养成计划什么时候出 公测上线时间预告
- 滞困异星黎明DUMA-KEY种子是什么 热推荐
- 湖南一监考老师忘带监考证 交警铁骑火速带老师取回
- 鬼谷八荒删了version.dll应该如何处理
- 外交部发言人:中洪关系实现“开门红”_天天信息
- 原创组图|高考进行时!考场外的守候是父母无声的爱
- Win10玩CF蓝屏原因及解决方法
- 高考首日衡水中学高考生6点跑操 成为考前一道靓丽风景线
- 速递!浙江省宁波市市场监督管理局高新技术产业开发区分局食品安全餐饮服务环节监督抽检信息通告(2023年第3期)
- 每日热闻!《暗黑破坏神4》惊骇缰绳获得方法
- 全球观察:港股倒跌 北水减磅净沽81亿
- 森泰股份:6月6日融资买入446万元,融资融券余额2054.12万元
- 自动修复dxpps.dll丢失方法_当前动态
- 天天即时:重庆市涪陵区市场监管局驻场式监管高考考点食品安全
- 天天头条:微软非法收集儿童信息 付1.6亿和解
- 世界热文:移动硬盘坏道修复工具哪个好
- 关于航天的知识简短|世界快看点
- 今日热搜:高校鼠头涉事窗口几乎没人去吃饭 校方监管局多方回应
- 全球微头条丨关于感恩老师的故事
- 世界即时看!奥海科技(002993):日K线呈现-“曙光初现”形态 后市看多(06-07)
- 天天速讯:北京发现两例猴痘病例 该如何预防猴痘?