产品展示
  • 精选三个装引磁片车载磁吸手机磁性支架配件背带强力3M胶无磁铁片
  • 瓦尔塔启停蓄电池AGM92Ah宝马320Li/328i/320i捷豹XFLXEL汽车电瓶
  • 五菱荣光V改装宏光V装饰门槛条不锈钢迎宾脚踏板后杠护板专用配件
  • 长城哈弗H5H3H6车身彩条改装专用运动版腰线拉花哈佛全车贴花贴纸
  • 东风小康K07S/C37/K07/C35/C36/V27小面包车原装电瓶45汽车蓄电池
联系方式

邮箱:admin@aa.com

电话:020-123456789

传真:020-123456789

汽车配件

管理订单状态,该用上状态机吗?

2024-05-08 11:57:22      点击:143

管理订单状态,该用上状态机吗?

技术之路不迷路~

前言

在平常的管理该用后端项目开发中 ,状态机模式的订单使用其实没有大家想象中那么常见 ,笔者之前由于不在电商领域工作,状态很少在业务代码中用状态机来管理各种状态 ,上状一般都是态机手动get/set状态值  。去年笔者进入了电商领域从事后端开发。管理该用电商领域 ,订单状态又多又复杂,状态如果仍然在业务代码中东一块西一块维护状态值 ,上状很容易陷入出了问题难于Debug ,态机难于追责的管理该用窘境。

碰巧有个新启动的订单项目需要进行订单状态的管理,我着手将Spring StateMachine接入了进来  ,状态管理购物订单状态   ,上状不得不说,态机Spring StateMachine全家桶的文档写的是不错 ,并且Spring StateMachine也是有官方背书的。但是,它实在是太”重“了,想要简单修改一个订单的状态,需要十分复杂的代码来实现  。具体就不在这里展开了,不然我感觉可以吐槽一整天 。

说到底Spring StateMachine上手难度非常大 ,如果没有用来做重型状态机的需求,十分不推荐普通的小项目进行接入 。

最最重要的是 ,由于Spring StateMachine状态机实例不是无状态的,无法做到线程安全,所以代码要么需要使用锁同步,要么需要用Threadlocal ,非常的痛苦和难用。例如下面的Spring StateMachine代码就用了重量级锁保证线程安全 ,在高并发的互联网应用中,这种频繁的获取释放锁会造成严重的性能问题 。

private synchronized boolean sendEvent(Message<PurchaseOrderEvent> message, OrderEntity orderEntity) {
boolean result = false;
try {
stateMachine.start;
// 尝试恢复状态机状态
persister.restore(stateMachine, orderEntity);
// 执行事件
result = stateMachine.sendEvent(message);
// 持久化状态机状态
persister.persist(stateMachine, (OrderEntity) message.getHeaders.get("purchaseOrder"));
} catch (Exception e) {
log.error("sendEvent error

英雄联盟杰斯皮肤最全汇总(英雄联盟杰斯哪款皮肤手感最好)
魔兽世界祖尔格拉布坐骑掉落(祖尔格拉布坐骑怎么刷)