1.流程启动参数
我们在流程启动的时候一般采用两种启动方式
startProcessInstanceByKey(String key,Map map);根据流程部署key启动
startProcessInstanceById(String Id,Map map);根据流程部署Id启动
两个方式都有使用,(一般我会在定时任务中使用ByKey来启动流程)
二者的作用都是启动流程,只是一个根据id一个根据key来启动。不过两个方法的第二个参数都是map集合。这个map集合的作用非常大,以至于我们流程中每一个步骤都要使用到它。
2.启动后的map会存储到什么地方?
使用上述的方法启动后,变量会被流程引擎框架自动存储。首先存储到 act_ru_variable 表中
我们需要注意的是该表的几个字段:TYPE_ 、NAME_ 、PROC_INST_ID
TYPE_:map中的value变量类型
NAME_:map中的key值
PROC_INST_ID:流程启动后生成的该流程全局唯一ID
上图可以看出我存储的类型值是多种类型的,有String、boolean、serializable等
我重点想说的就是serializable类型。
3.流程变量中对象的存储
BYTEARRAY_ID:如果该数据为对象,则会存储至act_ge_bytearray表中,该值就是这个对应的主键ID。
当我们启动流程后Map中存储的数据为对象类型,框架会在启动时候,将数据存储至act_ge_bytearray表中,然后分配对应的主键ID做关联查询,并且该act_ru_variable表中对应的数据TYPE_为serializable
我们去act_ge_bytearray表中查询后可以看出对应的值被存储在BYTES_中,类型是BLOB,且NAME_字段值被加了前缀var
这个时候有同学会问了,那如果我的流程结束后存到了历史流程表中后,数据咋整嘞?
下图可以看出flowable做了额外处理来区分正在进行的流程变量和历史流程变量
有一点需要提醒一下同学们
有时NAME_字段的值会相同但是BYTES资源的值不同,但是!!!
这两个不是一个流程,只是在不同的流程中,传递的map的key相同!!!
重点还是要根据ID_来区分!!!
下图(act_ru_variable表)中可以看出,虽然二者的NAME_一样,但是流程业务实例ID(PROC_INST_ID)绝对不是一样的。这是因为我们传递的是MAP,而MAP的特点就是key相同后覆盖value,所以一个流程中绝对不会出现两个相同的变量名!!!