流程变量-设置和检索变量概述
设置和检索变量-概述
为了设置和检索变量,流程引擎提供了Java API,该API允许设置Java对象中的变量并以相同的形式检索它们。在内部,引擎将变量持久化到数据库,因此应用序列化。对于大多数应用程序,这是一个无关紧要的细节。但是,有时,当使用自定义Java类时,变量的序列化值会很重要。想象一下管理多个流程应用程序的监视应用程序的情况。它与那些应用程序的类分离,因此无法访问其Java表示形式的自定义变量。对于这些情况,流程引擎提供了一种检索和操纵序列化值的方法。这归结为两个API:
1、Java对象值API:变量表示为Java对象。这些对象可以直接设置为值并以相同的形式检索。这是更简单的API,是将代码作为流程应用程序的一部分实现时的推荐方法。
2、类型值API:变量值被包裹在所谓类型的值被用于设置并检索变量。带类型的值提供对元数据的访问,例如引擎对变量进行序列化的方式,以及根据类型对变量进行序列化的表示形式。元数据还包含有关变量是否为瞬态的信息。
例如,以下代码使用两个API检索并设置两个整数变量:
// Java Object API: Get Variable
Integer val1 = (Integer) execution.getVariable("val1");
// Typed Value API: Get Variable
IntegerValue typedVal2 = execution.getVariableTyped("val2");
Integer val2 = typedVal2.getValue();
Integer diff = val1 - val2;
// Java Object API: Set Variable
execution.setVariable("diff", diff);
// Typed Value API: Set Variable
IntegerValue typedDiff = Variables.integerValue(diff);
execution.setVariable("diff", typedDiff);
在Java Object Value API和Typed Value API的各节中,会更详细地描述了此代码的细节。
将变量设置为特定范围
可以通过脚本,输入\输出映射,侦听器和服务任务将变量设置为特定范围。此功能的实现使用活动ID来标识目标范围,如果未找到用于设置变量的范围,则将引发异常。此外,一旦找到目标作用域,将在其中局部设置变量,这意味着即使目标作用域没有给定id的变量,也不会传播到父作用域。
这是脚本executionListener的用法示例:
<camunda:executionListener event="end">
<camunda:script scriptFormat="groovy"><![CDATA[execution.setVariable("aVariable", "aValue","aSubProcess");]]></camunda:script></camunda:executionListener>
另一个用法示例是使用DelegateVariableMapping实现的输入\输出映射
public class SetVariableToScopeMappingDelegate implements DelegateVariableMapping {
@Override
public void mapInputVariables(DelegateExecution superExecution, VariableMap subVariables) {
}
@Override
public void mapOutputVariables(DelegateExecution superExecution, VariableScope subInstance) {
superExecution.setVariable("aVariable","aValue","aSubProcess");
}}
即使变量不是事先在“ aSubProcess”中本地设置的,此处变量也将在“ aSubProcess”中本地设置,并且不会传播到父范围。
支持的变量值
流程引擎支持以下变量值类型:
根据变量的实际值,分配不同的类型。在可用类型中,有九种原始值类型,这意味着它们存储简单标准JDK类的值而没有其他元数据:
1、boolean:实例 java.lang.Boolean
2、bytes:实例 byte[]
3、short:实例 java.lang.Short
4、integer:实例 java.lang.Integer
5、long:实例 java.lang.Long
6、double:实例 java.lang.Double
7、date:实例 java.util.Date
8、string:实例 java.lang.String
9、null:null参考
基本值与其他变量值的不同之处在于它们可以在API查询(例如流程实例查询)中用作过滤条件。
该类型file可用于存储文件或输入流的内容以及元数据(例如文件名,编码和文件内容所对应的MIME类型)。
值类型object表示自定义Java对象。当这样的变量持续存在时,其值将根据序列化过程进行序列化。这些过程是可配置和可交换的。
字符串长度限制
string值存储在数据库的type列中(n)varchar,长度限制为4000(对于Oracle为2000)。根据使用的数据库和配置的字符集,此长度限制可能会导致产生不同数量的实字符。变量值的长度未在盘古BPM引擎内部进行验证,但会将这些值“按原样”发送到数据库,并且,如果超出了长度限制,则会引发数据库级异常。如果需要验证,它可以单独实现,并且必须在调用盘古BPM API设置变量之前进行。
可以使用盘古BPM Spin插件提供的JSON和XML之类的格式存储过程变量。Spin为类型的变量提供了序列化程序,以便object可以将Java变量以这些格式持久化到数据库中。此外,可以通过值类型xml和将JSON和XML文档直接存储为Spin对象json。与普通string变量相反,Spin对象提供了一种流畅的API,可以对此类文档执行常见的操作,例如读写属性。
相关教程
- 2020-04-24
- 2020-04-23
- 2020-04-22
- 2020-04-18
- 2020-04-16
- 2020-04-14
- 2020-04-11
- 2020-04-11
- 2020-04-04
- 2020-04-04