流程变量-设置和检索变量概述

设置和检索变量-概述

为了设置和检索变量,流程引擎提供了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 APITyped 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,可以对此类文档执行常见的操作,例如读写属性。

 

 

 技术支持:盘古BPM工作流平台

相关教程