Activiti7(流程变量+网关)(3.17)
一、流程变量
1.流程变量类型:
| 类型名称(Type name) | 对应 Java 类型 | 核心描述 | 适用场景 & 注意事项 |
|---|---|---|---|
| string | java.lang.String |
字符串类型,原始 JSON 文本也会按此类型解析 / 存储 | 存储文本、编号、描述等;支持直接读写 JSON 字符串 |
| integer | java.lang.Integer |
整型,读写时会转换为文本格式持久化 | 常规整数数值(-2¹⁴⁷⁴⁸³⁶⁴⁸ ~ 2¹⁴⁷⁴⁸³⁶⁴⁷);业务计数、序号等 |
| short | java.lang.Short |
短整型,读写时转换为文本格式持久化 | 小范围整数(-32768 ~ 32767);节省存储开销的场景 |
| long | java.lang.Long |
长整型,读写时转换为文本格式持久化 | 大整数(-9²²³³⁷²⁰³⁶⁸⁵⁴⁷⁷⁵⁸⁰⁸⁸ ~ 9²²³³⁷²⁰³⁶⁸⁵⁴⁷⁷⁵⁸⁰⁸⁷);时间戳、ID 等 |
| double | java.lang.Double |
双精度浮点型,读写时转换为文本格式持久化 | 小数数值(如金额、比例、精度要求不高的计算) |
| boolean | java.lang.Boolean |
布尔型,读写时转换为文本格式持久化 | 状态标记(如是否通过、是否生效)、流程分支判断条件 |
| date | java.util.Date |
日期类型,写入时会按日期格式序列化 | 存储时间节点、截止日期、创建时间等;需注意时区转换 |
| binary | byte[](字节数组) |
二进制变量,按字节数组处理,支持原始数据流 | 存储文件、图片、二进制流数据;不支持直接文本编辑 |
| serializable | 实现 java.io.Serializable 的 Java 对象 |
可序列化 Java 对象的二进制表示,存储为二进制流,关联原始二进制流 URL | 存储自定义业务对象(如 POJO、DTO);复杂对象需谨慎,建议优先用 JSON 字符串替代 |
2.流程变量可以作用于:
-
在节点上:
可以在 assignee 处设置 UEL 表达式,表达式的值为任务的负责人,比如: ${assignee}, assignee 就是一个流程变量名称。
-
在连线上:
可以在连线上设置UEL表达式,决定流程走向。
-
true 则执行该连线
-
false 则不执行
使用:画图时,在连线上使用${} UEL表达式的方式填写上内容(条件表达式)
赋值:
- 启动流程时
- 使用到流程变量之前
-

3.流程变量Plus版:
流程变量的三种特殊情况:
(1)若启动程序时,我们没有为连线上的流程变量赋值会怎样?
//启动程序不会报错。若使用到了该流程变量则会抛异常。(若启动时就使用到了该流程变量则会直接报错)
Caused by: javax.el.PropertyNotFoundException: Cannot resolveidentifierday
(2)若启动程序时,多条连线上的条件都不满足会怎样?
//会抛异常。找不到一条可以解析的出口
org.activiti.engine.ActivitiException: No outgoing sequence flow of element 'sid-628e4932-8d64-4720-8fel-320ed092c2a0' could be selected for continuing the process
(3)若启动程序时,多条连线上的条件都满足会怎样?
//会将所有满足条件的连线都执行。
二、网关
网关就是来解决一些特殊情况下出现的问题
(1)排他网关:

只能解决③问题
①若启动程序时,我们没有为连线上的流程变量赋值会怎样?(与流程变量一致)
//启动程序不会报错。若使用到了该流程变量则会抛异常。(若启动时就使用到了该流程变量则会直接报错)
Caused by: javax.el.PropertyNotFoundException: Cannot resolveidentifierday
②若启动程序时,多条连线上的条件都不满足会怎样?(与流程变量一致)
//会抛异常。找不到一条可以解析的出口
org.activiti.engine.ActivitiException: No outgoing sequence flow of element 'sid-628e4932-8d64-4720-8fel-320ed092c2a0' could be selected for continuing the process
③若启动程序时,多条连线上的条件都满足会怎样?
//画图时,先给谁连线,谁执行。(只会选择一条执行)
(2)并行网关:

基于进和出的原则。
不会解析连线上的流程变量,也就是怎么进来的就怎么出去。
当进入网关后,需要将所有的节点都执行成功后,才能走到下一节点。
①若启动程序时,我们没有为连线上的流程变量赋值会怎样?
//都执行
②若启动程序时,多条连线上的条件都不满足会怎样?
//都执行
③若启动程序时,多条连线上的条件都满足会怎样?
//都执行
注意:
并行网关是不会解析连线上的流程变量,会解析节点上的流程变量。
- 若节点上不设置值,还是会抛异常。
(3)包含网关:

①若启动程序时,我们没有为连线上的流程变量赋值会怎样?(与流程变量一致)
//启动程序不会报错。若使用到了该流程变量则会抛异常。(若启动时就使用到了该流程变量则会直接报错)
Caused by: javax.el.PropertyNotFoundException: Cannot resolveidentifierday
②若启动程序时,多条连线上的条件都不满足会怎样?
//那就都不执行,走没有条件的连线。
③若启动程序时,多条连线上的条件都满足会怎样?
//所有满足条件的连线及没有条件的连线都会执行。
