Skip to content
本页目录

状态机

状态机,又称为有限状态机(简称FSM)或状态机,是一种数学模型,主要用于描述系统或程序在不同状态之间的转换行为。它由一组状态、转移条件和动作组成。

状态机的定义

要定义一个状态机,需要定义其状态、状态间的转移条件和动作(也叫事件),以如下场景为例:

null

其中,新建已审核待复审审核通过为四个状态,送审同意退回为动作,需复审无需复审为转移条件。

XML定义

参考 BPMN 定义规范,状态机相关定义调整如下:

名称节点名对应BPMN相似特性节点相似点
状态流转过程ProcessProcess编码、名称
状态StateTask编码、名称、出口线、入口线、默认出口
动作(事件)EventSequenceFlow名称、条件、源节点、目标节点
判断(排他网关)ExclusiveGatewayExclusiveGateway名称、条件、源节点、目标节点

一个简单示例如下:

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是否退回操作值为:truefalse
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)

内部资料,请勿外传