赵走x博客
网站访问量:151427
首页
书籍
软件
工具
古诗词
搜索
登录
28、API变量
27、查询API
26、API异常策略
25、 流程引擎API与服务
24、事件处理器
23、映射诊断上下文
22、日志
21、配置部署缓存
20、配置在表达式与脚本中可用的bean
19、配置异步历史
18、配置历史
17、作业执行器
16、数据库与表
15、支持的数据库
14、配置JNDI数据源
13、配置数据库
12、ProcessEngineConfiguration bean
11、创建ProcessEngine
10、开始使用Flowable REST API
9、使用历史数据
8、实现JavaDelegate
7、查询与完成任务
6、另一个话题:事务
5、启动流程实例
4、部署流程定义
3、构建命令行程序
2、Flowable是什么?
1、简介
28、API变量
资源编号:551154
热度:114
28、Flowable BPMN 用户手册 (v 6.3.0):API变量
流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在Java服务任务(service task)中用于调用外部服务(例如为服务调用提供输入或结果存储),等等。 流程实例可以持有变量(称作流程变量 process variables);用户任务以及执行(executions)——流程当前活动节点的指针——也可以持有变量。流程实例可以持有任意数量的变量,每个变量存储为ACT_RU_VARIABLE数据库表的一行。 所有的startProcessInstanceXXX方法都有一个可选参数,用于在流程实例创建及启动时设置变量。例如,在RuntimeService中: ``` ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map
variables); ``` 也可以在流程执行中加入变量。例如,(RuntimeService): ``` void setVariable(String executionId, String variableName, Object value); void setVariableLocal(String executionId, String variableName, Object value); void setVariables(String executionId, Map
variables); void setVariablesLocal(String executionId, Map
variables); ``` 请注意可以为给定执行(请记住,流程实例由一颗执行的树(tree of executions)组成)设置局部(local)变量。局部变量将只在该执行中可见,对执行树的上层则不可见。这可以用于 数据不应该暴露给流程实例的其他执行,或者变量在流程实例的不同路径中有不同的值(例如使用并行路径时)的情况。 可以用下列方法读取变量。请注意TaskService中有类似的方法。这意味着任务与执行一样,可以持有局部变量,其生存期为任务持续的时间。 ``` Map
getVariables(String executionId); Map
getVariablesLocal(String executionId); Map
getVariables(String executionId, Collection
variableNames); Map
getVariablesLocal(String executionId, Collection
variableNames); Object getVariable(String executionId, String variableName);
T getVariable(String executionId, String variableName, Class
variableClass); ``` 变量通常用于Java代理(Java delegates)、表达式(expressions)、执行(execution)、任务监听器(tasklisteners)、脚本(scripts)等等。在这些结构中,提供了当前的execution或task对象,可用于变量的设置、读取。简单示例如下: ``` execution.getVariables(); execution.getVariables(Collection
variableNames); execution.getVariable(String variableName); execution.setVariables(Map
variables); execution.setVariable(String variableName, Object value); ``` 请注意也可以使用上例中方法的局部变量版本。 由于历史(与向后兼容)原因,当调用上述任何方法时,引擎会从数据库中取出所有变量。也就是说,如果你有10个变量,使用getVariable("myVariable")获取其中的一个,实际上其他9个变量也会从数据库取出并缓存。这并不坏,因为后续的调用可以不必再读取数据库。比如,如果流程定义包含三个连续的服务任务(因此它们在同一个数据库事务里),在第一个服务任务里通过一次调用获取全部变量,也许比在每个服务任务里分别获取需要的变量要好。请注意对读取与设置变量都是这样。 当然,如果使用大量变量,或者你希望精细控制数据库查询与流量,上述的做法就不合适了。我们引入了可以更精细控制的方法。这个方法有一个可选的参数,告诉引擎是否需要读取并缓存所有变量: ``` Map
getVariables(Collection
variableNames, boolean fetchAllVariables); Object getVariable(String variableName, boolean fetchAllVariables); void setVariable(String variableName, Object value, boolean fetchAllVariables); ``` 当fetchAllVariables参数为true时,行为与上面描述的完全一样:读取或设置一个变量时,所有的变量都将被读取并缓存。 而当参数值为false时,会使用明确的查询,其他变量不会被读取或缓存。只有指定的变量的值会被缓存并用于后续使用。