变量

每个流程实例都需要并使用数据来执行其存在的步骤,在Activiti中,此数据称为变量,这些变量存储在数据库中,变量可用于表达式中(例如,在独占网关中选择正确的传出序列流)、在java服务任务中调用外部服务时(例如,提供输入或存储服务调用的结果)等。

流程实例可以具有变量(称为流程变量),也可以具有执行(它们是指向流程活动位置的特定指针),并且用户任务可以具有变量。流程实例可以具有任意数量的变量,每个变量都存储在ACT_RU_VARIABLE数据库表的一行中。

任何startProcessInstanceXXX方法都具有可选参数,以在创建和启动流程实例时提供变量,例如,从RuntimeService中:

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);

可以在流程执行期间添加变量,例如(RuntimeService):

void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);

请注意,可以为给定执行将变量设置为本地(请记住,流程实例由执行树组成),该变量仅在该执行中可见,而在执行树中不可见。如果数据不应该传播到流程实例级别,或者该变量在流程实例中的某个路径具有新值(例如,使用并行路径时),则这很有用。

也可以再次获取变量,如下所示,请注意,TaskService上存在类似的方法,这意味着任务,像执行一样,可以具有仅在任务期间有效的局部变量。

Map<String, Object> getVariables(String executionId);
Map<String, Object> getVariablesLocal(String executionId);
Map<String, Object> getVariables(String executionId, Collection<String> variableNames);
Map<String, Object> getVariablesLocal(String executionId, Collection<String> variableNames);
Object getVariable(String executionId, String variableName);
<T> T getVariable(String executionId, String variableName, Class<T> variableClass);

变量通常用于Java委托、表达式、执行侦听器或任务侦听器、脚本等中,在这些构造中,当前执行或任务对象是可用的,并且可用于变量设置和/或检索,最简单的方法是:

execution.getVariables();
execution.getVariables(Collection<String> variableNames);
execution.getVariable(String variableName);

execution.setVariables(Map<String, object> variables);
execution.setVariable(String variableName, Object value);

请注意,上述所有内容都可以使用带有local的变体。

由于历史原因(以及向后兼容的原因),在进行上述任何调用时,实际上都会从数据库中获取所有变量,这意味着,如果你有10个变量,并且仅通过getVariable("myVariable")获得一个变量,则将在后台获取和缓存另外9个变量,这还不错,因为后续调用不会再次命中数据库。例如,当你的流程定义具有三个连续的服务任务(因此有一个数据库事务)时,在第一个服务任务中使用一个调用来提取所有变量可能比分别获取每个服务任务中所需的变量更好,请注意,这适用于获取和设置变量。

当然,当使用大量变量或仅当你想严格控制数据库查询和流量时,这是不合适的,自Activiti 5.17起,通过添加具有可选参数的新方法,引入了新方法以对此进行更严格的控制,该可选参数告诉引擎是否需要在后台获取和缓存所有变量:

Map<String, Object> getVariables(Collection<String> variableNames, boolean fetchAllVariables);
Object getVariable(String variableName, boolean fetchAllVariables);
void setVariable(String variableName, Object value, boolean fetchAllVariables);

对参数fetchAllVariables使用true时,行为将完全如上所述:在获取或设置变量时,将提取并缓存所有其他变量。

但是,当使用false作为值时,将使用特定查询,并且不会获取或缓存其他任何变量,这里只缓存该问题的变量的值,以供后续使用。



博弈
2.5k 声望1.5k 粉丝

态度决定一切


引用和评论

0 条评论