前言
Activiti的参数有两种类型,一类是流程参数,一类是任务参数;流程参数是通过RuntimeService服务组件设置,在设置的过程中需要传入执行流ID;任务参数是通过TaskService服务组件设置,在设置的过程中需要传入任务ID;所以我们可以形象的认为流程参数是和执行流绑定到了一起,任务参数是和任务绑定到了一起。任务参数可以查看这篇文章《Activiti任务参数的设置方式和作用域》
一、流程参数有两种设置方式
1:启动流程实例时设置参数,用runtimeService.startProcessInstanceById(流程id,参数map);此种方式设置的流程参数相当于设置到了主执行流中。
2:在流程启动之后,用runtimeService.setVariable(执行流Id,参数名,参数值)或者runtimeService.setVariableLocal(执行流Id,参数名,参数值)的方式设置参数;此种方式设置参数依靠执行流,可以是主执行流,也可以是子执行流。
二、流程参数的作用域
1:流程实例中只有一个执行流时,即只有主执行流时;无论是在启动流程时设置流程参数,还是在启动后通过setVariable或者通过setVariableLocal的方式来设置流程参数,则都可以通过getVariable和getVariableLocal的方式获取到设置的流程参数;
2:流程实例中除了主执行流外,还有子执行流时;此时情况比较复杂,分开描述:
(1)当在主执行流中设置流程参数,无论以何种方式设置,则在主执行流中通过任何方式都可以获取到,在所有子执行流中也可以通过getVariable的方式获取到;
(2)当在某个子执行流中设置流程参数时,如果是通过setVariable方式设置,则在所有子执行流中都可以通过getVariable方式获取到,在主执行流中可以通过任何方式获取到;
(3)当在某个子执行流中设置流程参数时,如果是以setVariableLocal方式设置,则在当前子执行流中可以通过任何方式获取到,在其他子执行流中不可以获取到,在主执行流中也不可以获取到,因为参数的作用域仅仅局限于当前设置的子执行流中,而且子执行流执行结束之后,参数就会失效。
3:流程参数作用域的个人理解
(1)在一个流程实例中,流程参数的作用域可以理解为有两类区域,一类共有区域(只有一个共有区域,所有执行流共享),一类私有区域(每个子执行流都有自己的私有区域);
(2)主执行流只能操作共有区域,无论是通过setVariable和getVariable,还是通过setVariableLocal和getVariableLocal;操作的都是共享的那个共有区域;
(3)子执行流即可以操作共有区域(setVariable和getVariable),也可以操作自己的私有区域(setVariableLocal和getVariableLocal)(子执行流的getVariable也可以操作自己的私有区域);
(4)主执行流无论通过何种方式设置参数,都是将参数设置到共有区域中;主执行流无论通过何种方式获取都是从共有区域中获取参数;
(5)子执行流通过setVariable设置的参数,被设置到了共有区域;子执行流通过getVariable方式是从共有区域里获取参数(也会从自己的私有区域获取参数);
(6)子执行流通过setVariableLocal设置的参数,被设置到了自己的私有区域里;子执行流通过getVariableLocal从自己的私有区域里获取参数。
4:流程参数在数据库中的表现形式
(1)现象
- 主执行流id为2501(和流程实例id一样),子执行流id为7502和7503;
- 在主执行流中设置的参数的参数名有start、local、nolocal,它们的的EXECUTION_ID_字段的值都是主执行流的id2501;
- 在子执行流7502中通过setVariableLocal设置的参数的参数名为7502,它的的EXECUTION_ID_字段的值是该子执行流的id7502;
- 在子执行流7503中通过setVariable设置的参数的参数名为7503,它的EXECUTION_ID_字段的值是主执行流的id2501;
(2)总结
- 被放置到共有区域的参数的EXECUTION_ID_字段的值都是主执行流的id,被放到子执行流私有区域的参数的EXECUTION_ID_字段的值为该子执行流的id
- 通过主执行流的任何方式获取参数时,都是以主执行流的id为条件从变量表的EXECUTION_ID_中查找参数;
- 通过子执行流的getVariableLocal方式获取参数时,以子执行流的id为条件从变量表的EXECUTION_ID_中查找参数;
- 通过子执行流的getVariable方式获取参数时,不仅以主执行流的id为条件从变量表的EXECUTION_ID_中查找参数,还以该子执行流的id为条件从变量表的EXECUTION_ID_中查找参数;