Appearance
状态机
状态机,又称为有限状态机(简称FSM)或状态机,是一种数学模型,主要用于描述系统或程序在不同状态之间的转换行为。它由一组状态、转移条件和动作组成。
状态机的定义
要定义一个状态机,需要定义其状态、状态间的转移条件和动作(也叫事件),以如下场景为例:
null
其中,新建
、已审核
、待复审
、审核通过
为四个状态,送审
、同意
、退回
为动作,需复审
、无需复审
为转移条件。
XML定义
参考 BPMN 定义规范,状态机相关定义调整如下:
名称 | 节点名 | 对应BPMN相似特性节点 | 相似点 |
---|---|---|---|
状态流转过程 | Process | Process | 编码、名称 |
状态 | State | Task | 编码、名称、出口线、入口线、默认出口 |
动作(事件) | Event | SequenceFlow | 名称、条件、源节点、目标节点 |
判断(排他网关) | ExclusiveGateway | ExclusiveGateway | 名称、条件、源节点、目标节点 |
一个简单示例如下:
null
XML定义如下:
xml
<bpmn:definitions>
<bpmn:process id="sm_1">
<fbp:state id="a" name="新建">
<bpmn:outgoing>event_1</bpmn:outgoing>
</fbp:state>
<fbp:state id="b" name="待审核">
<bpmn:incoming>event_1</bpmn:incoming>
<bpmn:outgoing>event_2</bpmn:outgoing>
</fbp:state>
<bpmn:exclusiveGateway id="c" name="判断">
<bpmn:incoming>2</bpmn:incoming>
<bpmn:outgoing>3</bpmn:outgoing>
<bpmn:outgoing>4</bpmn:outgoing>
</fbp:state>
<fbp:state id="d" name="待复审">
<bpmn:incoming>4</bpmn:incoming>
<bpmn:outgoing>5</bpmn:outgoing>
</fbp:state>
<fbp:state id="e" name="已审核">
<bpmn:incoming>3</bpmn:incoming>
<bpmn:incoming>5</bpmn:incoming>
</fbp:state>
<bpmn:sequenceFlow id="event_1" name="送审"
sourceRef="a" targetRef="b" />
<bpmn:sequenceFlow id="event_2" name="审核"
sourceRef="b" targetRef="c" />
<bpmn:sequenceFlow id="event_3" name="无需复审"
sourceRef="c" targetRef="e" />
<bpmn:sequenceFlow id="event_4" name="需要复审"
sourceRef="c" targetRef="d" />
<bpmn:sequenceFlow id="event_5" name="复审"
sourceRef="d" targetRef="e" />
</bpmn:process>
</bpmn:definitions>
状态 State
属性 | 含义 | 说明 |
---|---|---|
id | 状态编号 | 唯一,一般为数字、字符、英文单词等,表示状态值 |
name | 状态名称 | 中文 |
动作 SequenceFlow
属性 | 含义 | 说明 |
---|---|---|
id | 状态编号 | 唯一,任意字符串,仅用于区分动作 |
name | 状态名称 | 中文 |
isReturned | 是否退回操作 | 值为:true ,false |
expression | 执行条件表达式 | 表达式,动作可被执行的条件 |
判断 ExclusiveGateway
属性 | 含义 | 说明 |
---|---|---|
id | 判断编号 | 唯一,任意字符串,仅用于区分节点元素 |
name | 判断名称 | 中文 |
状态机场景分析
简单场景
状态按顺序转移,每个状态只有一个操作
null
分支场景
根据动作不同,可以转移到不同的状态
null
条件分支场景
根据条件不同,一个状态所能操作的动作会有差异
null
新建记录后,根据条件不同,可执行动作为送审或免审
动态转移场景
动作发生后,根据条件,转移到不同的状态
null
新建记录后,可执行动作为送审,执行后,根据条件不同,状态可能为审核通过或待审核
退回场景1:使用不同状态标记退回数据
使用一个新状态来表示退回状态
null
采用此方法,已退回为一种新状态,和新建状态完全分开,比较适合退回状态记录由不同人处理或后续操作与新建差异较大的情况
退回场景2:使用相同状态标记退回数据
使用原状态,但用一个退回状态标记来表示退回状态
null
采用此方法,退回的数据还是新建状态,只是带 退回标记 用于区分而已,后续操作同新建记录
状态机的使用
根据状态获取后续动作
java
public static Event[] getEvents(String stateMachineCode, String stateId)
促发事件(包括退回)
java
public static State triggerEvent(String stateMachineCode,
String stateId, String eventId, Object variables)