接上篇:https://developer.aliyun.com/article/1228228?spm=a2c6h.13148508.setting.32.62774f0e61109O
三、 流程定义不合理
1. 原有的采购流程
这是一个简易的采购流程,由库管系统发起采购,采购员开始采购,采购员完成采购,同时回流采集订单到库管系统。
其中,完成采购动作的核心代码如下:
由于函数backflowPurchaseOrder(回流采购单)调用了HTTP接口,可能引起以下问题:
• 该函数可能耗费时间较长,导致完成采购接口成为慢接口;
• 该函数可能失败抛出异常,导致客户调用完成采购接口失败。
2. 优化的采购流程
通过需求分析,把“采购员完成采购并回流采集订单”动作拆分为“采购员完成采购”和“回流采集订单”两个独立的动作,把“采购完成”拆分为“采购完成”和“回流完成”两个独立的状态,更方便采购流程的管理和实现。
拆分采购流程的动作和状态后,核心代码如下:
其中,函数executeBackflow(执行回流)由定时作业触发执行。如果回流采购单失败,采购单状态并不会修改为“已回流”;等下次定时作业执行时,将会继续执行回流动作;直到回流采购单成功为止。
3. 有限状态机介绍
1) 概念
有限状态机(Finite-state machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的一个数学模型。
2) 要素
状态机可归纳为4个要素:现态、条件、动作、次态。
• 现态:指当前流程所处的状态,包括起始、中间、终结状态;
• 条件:也可称为事件;当一个条件被满足时,将会触发一个动作并执行一次状态的迁移;
• 动作:当条件满足后要执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态;
• 次态:当条件满足后要迁往的状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
3) 状态
状态表示流程中的持久状态,流程图上的每一个圈代表一个状态。
• 初始状态:流程开始时的某一状态;
• 中间状态:流程中间过程的某一状态;
• 终结状态:流程完成时的某一状态。
使用建议:
• 状态必须是一个持久状态,而不能是一个临时状态;
• 终结状态不能是中间状态,不能继续进行流程流转;
• 状态划分合理,不要把多个状态强制合并为一个状态;
• 状态尽量精简,同一状态的不同情况可以用其它字段表示。
4) 动作
动作的三要素:角色、现态、次态,流程图上的每一条线代表一个动作。
• 角色:谁发起的这个操作,可以是用户、定时任务等;
• 现态:触发动作时当前的状态,是执行动作的前提条件;
• 次态:完成动作后达到的状态,是执行动作的最终目标。
使用建议:
• 每个动作执行前,必须检查当前状态和触发动作状态的一致性;
• 状态机的状态更改,只能通过动作进行,其它操作都是不符合规范的;
• 需要添加分布式锁保证动作的原子性,添加数据库事务保证数据的一致性;
• 类似的动作(比如操作用户、请求参数、动作含义等)可以合并为一个动作,并根据动作执行结果转向不同的状态。
接下篇:https://developer.aliyun.com/article/1228223?groupCode=java